Python 30์ผ๐จโ๐ป - 9์ผ์ฐจ. - OOP ๋ฒํ๋ชฉ.
OOP์ ๊ธฐ๋ณธ์ ์ผ๋ก 4๊ฐ์ ๊ธฐ๋ฅ์ด๋ ํต์ฌ ์์น, ์ฆ ์ด๋ฅธ๋ฐ OOP ๊ธฐ๋ฅ์ด ์๋ค
๋ด์ธ - ๋น๋ก ๋๋ ์ง๋ ๊ธ์์ OOP์ ๊ธฐ์ด ์ง์์ ์๊ฐํ์ง๋ง, ๋๋ ์ด๋ฏธ ๋ด์ธ์ ๊ฐ์ ์ ์ผ๋ก ์๊ฐํ๋ค.๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด, ๋ด์ธ์ ์ฉ๊ธฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ด ์์ฑ๊ณผ ๊ด๋ จ๋ ์์ฑ๊ณผ ์์ ์ด ํจ๊ป ๊ทธ๋ฃนํ๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
class Avenger:
def __init__(self, name, knownAs):
self.name = name
self.knownAs = knownAs
def reveal_identity(self):
print(f'I am {self.name}, also known as {self.knownAs}')
hulk = Avenger('Bruce Banner', 'Hulk')
iron_man = Avenger('Tony Stark', 'IronMan')
hulk.reveal_identity() # I am Bruce Banner, also known as Hulk
iron_man.reveal_identity() # I am Tony Stark, also known as IronMan
์๊ธฐ ํด๋์ค์์ reveal_identity
๋ฐฉ๋ฒ์ ํธ์ถํ๋ฉด ๋ชจ๋ ๋ณต์์์ ์ ๋ถ์ ํ์ํฉ๋๋ค.๋ค์ ๋งํ๋ฉด ๊ทธ๋ค์ ์ ๋ถ์ ์ด๋ฏธ ๋ด์ธ๋์๋ค.์ด๋ฐ ์ด๋ค ์กฐ์์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ข
๋ฅ๋ฅผ ์ด๋ ๊ฒ ๊ฐํ๊ฒ ๋ง๋ ๋ค.ํด๋์ค์์ ๋์์ ๋ง๋ค ๋, ์ฐ๋ฆฌ๋ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ์์
์ ์ํํ ์ ์์ผ๋ฉฐ, ๊ทธ๋ค์ด ์ด๋ป๊ฒ ์ด ์์
์ ์คํํ๋์ง ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค.๋ณต์์์ฒ๋ผ!์ถ์์ ์ธ ๊ฐ๋ - ์ด์ ์ ๋ฐฐ์ฐ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋จ์ง ์ธ ๊ฐ์ง ์ธก๋ฉด์ ์ง์์ธ a, B์ C, ์ฆ ๊ฐ์๊ธฐ, ์ ๋๊ธฐ์ ํด๋ฌ์น(์ง๊ธ์ ์๋์ฐจ๊ฐ ์์ผ๋ ๋์ฑ ๊ฐ๋จํ๋ค)๋ฅผ ์ดํดํ ์ ์๋ค.์ด์ ์ฌ๋ก์ ์ฐ๋ฆฌ๋ ๋ฌด์์ด ์๋์ฐจ๋ฅผ ๊ฐ์์ํค๋์ง ์ ํ์๋, ๋ธ๋ ์ดํฌ๋ฅผ ๋ฐ์ ๋ ์๋์ฐจ๊ฐ ์ด๋ป๊ฒ ๋ฉ์ถ๋์ง ์ ํ์๋ ์๋ค.์ด๊ฒ์ ์ถ์์ด๋ผ๊ณ ํ๋ค.๊ทธ๊ฒ์ ํ์ค ์ํ์์ ์ด๋์๋ ์๋ค.์ ์ ๋ฒํผ์ ๊ฐ๋ณ๊ฒ ๋๋ฌ ์ปดํจํฐ๋ฅผ ๊ฐ๋ํ๊ณ ํ๋ฉด์ ๊ฐ๋ณ๊ฒ ๋๋๋ ค ํด๋์ ํ์์ ์ฌ์ง์ ์บก์ฒํ๋ค. ์์ ์์์
reveal_identity
๋ฐฉ๋ฒ์ ์ถ์์ ์ด๋ค.class Avenger:
def __init__(self, name, knownAs):
self.name = name
self.knownAs = knownAs
def reveal_identity(self):
print(f'I am {self.name}, also known as {self.knownAs}')
hulk = Avenger('Bruce Banner', 'Hulk')
hulk.name = 'Thanos'
hulk.knownAs = 'Loki'
hulk.reveal_identity() # I am Thanos, also known as Loki
์์ ์ ํ ์คํ์ ๋ฌธ์ ๊ฐ ์กด์ฌํ๋ค.ํํฌ๊ฐ ๋ง๋ค์ด์ก์ง๋ง ๋กํค๊ฐ ์๊ณ ํํฌ๋ฅผ ํ๋
ธ์ค๋ก ์์ฅํ๊ธฐ๋ก ํ์ด์!์ด๊ฒ์ ์ง๊ธ ์ํ๋ ๊ฒ์ด ์๋๋ค. ๋น๋ก ๋ด์ธ๊ณผ ์ถ์์ ์คํํ์ง๋ง ๋ด๋ถ ๊ธฐ๋ฅ์ ์ธ๋ถ์์ ์๊ณกํ๊ฑฐ๋ ์์ ํ ์ ์๋ค.๊ธฐ๋ณธ์ ์ผ๋ก Python์ ๊ฐ์ธ ๋ณ์๋ฅผ ๋ง๋๋ ๊ฒ์ ์ง์ํ์ง ์์ต๋๋ค.๋ณ์์ ๋ฐฉ๋ฒ์ ์ ๊ทผํ ์ ์๊ฒ ํ๊ณ ์ง์ ํ ์ถ์์ ์ป์ ์ ์๋์ง ๋ ๋ง์ ํ์์ ํด์ผ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ธ ๋ณ์ ์์
_
๋ฅผ ๋ถ์ฌ์ ๊ทธ๊ฒ์ ๋ง๋๋ ๊ด๋ก๊ฐ ์๋ค.๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์์ธ๋ก ์ด ๋ณ์์ ๋ฐฉ๋ฒ์ ์
๋ฐ์ดํธํ๋ ค๊ณ ์๋ํ๋ ๊ฒ์ด ์๋๋ผ, ์ด๋ฅผ ์ฌ์ ๋ณ์๋ก ์๋ณํ ์ ์๋๋ก ํ๋ค.์ด๋ JavaScript World์์ ๊ฐ์ธ ๋ณ์๋ฅผ ์ ์ํ๋ ๋ฐฉ์๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.์์-๋ง ๊ทธ๋๋ก ์์์ ๋ถ๋๋ก๋ถํฐ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ๊ณ์นํ๋ ๊ฒ์ ์๋ฏธํ๋ค.๋ถ๋ชจ ํด๋์ค๋ฅผ ๋ฐํ์ผ๋ก ๋ถ๋ชจ ํด๋์ค๋ก๋ถํฐ ๊ณ์น๋ ๋ชจ๋ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.์ด๋ ๊ฒ ํ๋ ๊ฒ์ ๋น์ทํ ํด๋์ค ์ฌ์ด์์ ๊ธฐ๋ฅ์ ๊ณต์ ํ๊ธฐ ์ํด์์ด๋ฉฐ ๊ฐ์ ๋ ผ๋ฆฌ๋ฅผ ๋ฐ๋ณตํด์ ์์ฑํ ํ์๊ฐ ์๋ค.
class Player:
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
return f'{self.name} is running'
class Cricketer(Player): # Syntax to inherit a class
def catch_ball(self):
return f'{self.name} Caught the ball'
class Batsman(Cricketer):
def swing_bat(self):
return f'what a shot by {self.name}'
player1 = Batsman('Virat Kohli', 31)
print(player1.run())
print(player1.catch_ball())
print(player1.swing_bat())
player1์ ํ์๋ฅ์ ์ค๋ก์ด๋ค.ํ์๋ ํฌ๋ฆฌ์ผ ์ ์์ ํ ๋ถ๋ฅ๋ค.JavaScript ์ธ๊ณ์์๋ ํด๋์ค๊ฐ extends
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ฉ๋๋ค.๊ทธ๋์ ๋๋ ๋จ์ง ๋์ ์ฌ์ง ๋ชจ๋ธ์์ ๋์ ๋ค๋ฅธ ๋น๊ต๋ฅผ ํ์ ๋ฟ์ด๋ค.ํฌ๋ฆฌ์ผ๋ฅ๋ ๋ ์ ์์ ํ์ ํด๋์ค๋ ํ์ ํด๋์ค์ธ๋ฐ, ๋ค์ ๋งํ๋ฉด ์ ์๋ฅ๋ฅผ ๊ณ์นํ ๊ฒ์ด๋ค.ํ๋ ์ด์ด1์ ํ์๊ฐ ๋ง๋ ๋์์ด๊ธฐ ๋๋ฌธ์ ๋ฐฉ๋ง์ด๋ฅผ ํ๋๋ฅด๋ ๋์์ ๊ฐ์ง๊ณ ์๋ค.
ํฌ๋ฆฌ์ผ ์ ์์ ๋ฆฌ์๋ธ ๋ฅ๋ ฅ๋ ์ด์ด๋ฐ์๋ค.๋ฉ์์ด!
๊ทธ๊ฒ์ ๋ํ ์ ์ ๋ฅ์ ๋ฌ๋ฆฌ๊ธฐ ๋ฅ๋ ฅ์ ๊ณ์นํ๋ค.
Python์๋ ๋์์ด ํด๋์ค์ ์ค๋ก์ธ์ง ํ์ธํ๊ธฐ ์ํ ์์ฃผ ํธ๋ฆฌํ ๋ด์ฅ ํจ์
isinstance
๊ฐ ์์ต๋๋ค.class Player:
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
return f'{self.name} is running'
class Cricketer(Player):
def catch_ball(self):
return f'{self.name} Caught the ball'
class Batsman(Cricketer):
def swing_bat(self):
return f'what a shot by {self.name}'
player1 = Batsman('Virat Kohli', 31)
print(isinstance(player1, Batsman)) # True
print(isinstance(player1, Cricketer)) # True
print(isinstance(player1, Player)) # True
print(isinstance(player1, object)) # True
Since everything in Python is an object, all classes inherit all properties and methods from this base class object
๋ค์ค์ฑ-ํด๋ฆฌ๋ ๋ง์์ ๋ํ๋ด๊ณ morphism์ ํ์์ ๋ํ๋ธ๋ค.๊ทธ๋์ ๊ทธ ๊ธ์์ ๋ป์ ์ฌ๋ฌ ๊ฐ์ง ํ์์ผ๋ก ๋ํ๋๋ค.๋ชจ๋ ์์์ ์์ ๋์๋ฅ๋ ๊ฐ์ ๋ฐฉ๋ฒ์ ๊ณต์ ํ ์ ์์ง๋ง ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๋์์ด ํธ์ถํ ๋์์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ์กฐ์์ ์ํํ ์ ์๋ค.
class ProgrammingLanguage:
def __init__(self, name):
self.name = name
class JavaScript(ProgrammingLanguage):
def comment(self):
return(f'// A Comment in {self.name}')
class Python(ProgrammingLanguage):
def comment(self):
return(f'# A comment in {self.name}')
language1 = JavaScript('JavaScript')
language2 = Python('Python')
def add_comment(languageObject):
print(languageObject.comment())
add_comment(language1) # // A Comment in JavaScript
add_comment(language2) # # A comment in Python
for language in [language1, language2]:
print(language.comment())
# // A Comment in JavaScript
# # A comment in Python
์์ ์ฝ๋ ๋ธ๋ก์์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋์์ ๋ฐ์๋ค์ด๊ณ comment () ๋ฐฉ๋ฒ์ ํธ์ถํ๋ ์ ๋๋ฒ์ค ํจ์add comment๋ฅผ ๋ง๋ค์์ต๋๋ค.๊ฐ์comment ๋ฐฉ๋ฒ์ ์๋ก ๋ค๋ฅธ ๋์์ ์ฌ์ฉํ์ฌ ํธ์ถํ ๋ ๊ทธ๊ฒ๋ค์ดcomment ๋ฐฉ๋ฒ์ ์คํ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋๋ค.๋ ๋ฒ์งธ ๊ฒฝ์ฐ ์ธ์ด ๋์ ๋ชฉ๋ก์ ์ํํ ๋ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๋ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
์ด๊ฒ์ ๋คํ์ฑ์ด๋ค.
OOP ์์น์ ์ธ์ ์ฌ์ฉํ ์ง ๊ตฌ์ฒด์ ์ธ ์ง์นจ์ด๋ ๊ท์น์ ์์ง๋ง ๋ฌธ์ ์ง์ ์ ๋ฌ๋ ค ์๊ณ ๋ค์ํ ๋ฐฉ์์ผ๋ก OOP์ ๊ฐ๋ ์ ์์ฉํด ํด๊ฒฐ ๋ฐฉ์์ ์คํํ ์ ์๋ค.
์ค๋์ ์ฌ๊ธฐ๊น์ง.๋์ ์ฌ์ง ๋ชจ๋ธ์ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ ์์ ๊ฒฉ์ ๊ตฌ์ถํ๊ธฐ ์ํด ์ ์ฐจ ์งํํ๊ณ ์์์ง๋ ๋ชจ๋ฅธ๋ค.
๋ด์ผ ๋๋ ๋จ์ OOP ๊ฐ๋ ์ ์์ฑํ๊ณ ์ฌ๋ฏธ์๋ ์ธ์ฝ๋ฉ ์ฐ์ต์ ํ ๋ค์์ ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ํ๋ก๊ทธ๋๋ฐ ๋ฒ๋ก๋ฅผ ์์ํ ๊ณํ์ด๋ค.
์ฆ๊ฑฐ์ด ์๊ฐ ๋ณด๋ด์ธ์!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(Python 30์ผ๐จโ๐ป - 9์ผ์ฐจ. - OOP ๋ฒํ๋ชฉ.), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/arindamdawn/30-days-of-python-day-9-oop-pillars-4pfeํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค