Python 30์ผ๐จโ๐ป - 8์ผ์ฐจ-OOP ๊ธฐ๋ณธ ์ฌํญ
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ํ์ดํค์ผ๋ก ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๊ณ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋์ง์ ๋ํด ๋ช ํํ ์ฌ๊ณ ๋ฐฉ์๋ง ์๋ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ค.์ ์ด๊ฒ ์ค์ํฉ๋๊น?
ํ์ค ์ธ๊ณ์์ ํ์ค ํ๋ก์ ํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ๋ ๋งค์ฐ ๋ณต์กํ๋ค. ์ฌ์ง์ด ์ฝ๋๋ฅผ ํ ์ค ์์ฑํ๊ธฐ ์ ์ ๋๋์ ๋๋ ํญํ์ด ํ์ํ๋ค.
์ฐ์ํ ํ๋ก๊ทธ๋๋จธ๋ ์ฝ๋ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋๊ฐ๋ฅผ ๊ณ ๋ คํด์ผ ํ ๋ฟ๋ง ์๋๋ผ, ์ด๋ป๊ฒ ํ๋ฉด ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ , ํ์ํ ๋ ํ์ฅํ๊ธฐ ์ฝ๊ณ , ์ฝ๊ธฐ์ ์ฐ๊ธฐ๊ฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋๊ฐ๋ ๊ณ ๋ คํด์ผ ํ๋ค.
์ด๋ฐ ๊ตฌ์กฐ์ ์กฐ์ง ์ฝ๋์ ๋ฐฉ์์ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๊ฒ์ ํ๋์ ๋ชจ๋ธ๊ณผ ๊ฐ๋ค. ๊ฐ๋ฐ์๋ ์ด๋ฐ ๊ท์น์ ๋ฐ๋ผ ํผ๋์ ํผํ ์ ์๋ค.๊ฐ๋ฐ์๋ง๋ค ๋๋ํด์ง๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ ๋ง์ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ์์ํด ๋ณด์ธ์.
๋ง์ฝ ๋ช ํํ ๋ชจ๋ธ์ด ์๋ค๋ฉด, ์ด ํ๋ก์ ํธ๋ ๋ฐ๋์ ์คํจํ ๊ฒ์ด๋ค!
ํ์ดํค์ผ๋ก ๋์๊ฐ์!
ํ์ดํค์์๋ ๋ชจ๋ ๊ฒ์ด ํ๋์ ๋์์ด๋ค.๋ด๊ฐ ์ฐ๊ตฌํ ๋ฐ์ดํฐ ์ ํ์ ๋ชจ๋ ๋์์ด๋ค. ๊ทธ๋ค์ ๋ชจ๋ ์์ ์ ๊ด๋ จ ์์ฑ๊ณผ ์ผ๋ถ ์กฐ์์ ์คํํ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ง๊ณ ์๋ค.์ด ๋์๋ค์ ์ค๋ก๋ก ๊ทธ๊ฒ๋ค์ ํด๋์ค์์ ๋์จ ๊ฒ์ด๋ค.
์ด๊ฒ์ Python์ ๋ชจ๋ ๋ฐ์ดํฐ ํ์์ด ์ ์๋ ๊ตฌ์กฐ๋ ์ํ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๊ทธ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ธ๋ถ ์ฌํญ์ด ์ ์๋์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
print(type(2)) # <class 'int'>
print(type(2.5)) # <class 'float'>
print(type('Python')) # <class 'str'>
print(type(True)) # <class 'bool'>
print(type({})) # <class 'dict'>
print(type([])) # <class 'list'>
print(type(())) # <class 'tuple'>
print(type(None)) # <class 'NoneType'>
๋ด์ฅ๋ฅ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋์ฐจ, ๊ธฐ๊ณ, ์ธ๊ฐ, ๋๋ฌผ ๋๋ ๊ทธ ์ด๋ ํ ๊ฒ๋ ํ์ค ์ธ๊ณ์ ์ฌ๋ฌผ์ ๋ํ๋ด๋ ์ฌ์ฉ์ ์ ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.ํ์ค ์ธ๊ณ์ ์ค์ฒด์ ๊ทธ ์์ฑ๊ณผ ํ์๋ฅผ ์ฝ๋์ ์ ํ์ผ๋ก ๋ํ๋ด๋ ์ด๋ฐ ๋ฐฉ๋ฒ์ ๋์์ ๋์์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ๋ ๋ชจ๋ธ์ ๋ํ ๋์จํ ์ ์๋ก ์ฌ๊ฒจ์ง ์ ์๋ค.
๊ทธ๋ฐ ๋ค์ ๊ฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.์ด ๋์๋ค์ ์ค์ ์ธ๊ณ์ ๊ธฐ๋ฅ์ ๋ชจ์ํ๊ธฐ ์ํด ๋ค๋ฅธ ๋์๊ณผ ์กฐํฉํ ์ ์๋ค.
JavaScript ์ธ๊ณ์์๋ ์ฌ์ฉ์ ์ ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. (๋น๋ก JS์ ํด๋์ค๊ฐ ES6์์ ๋์ ํ ์ํ ํจ์ ์์ ๋ฌธ๋ฒ ์คํ๊ณผ ๋น์ทํ์ง๋ง.)๊ทธ๋์ ๋ด ์ฌ์ง ๋ชจ๋ธ์์ ๋๋ ๊ทธ๊ฒ๋ค ์ฌ์ด์ ๊ด๋ จ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค.
๊ทธ๋ฌ๋ ํ์ดํค์์ OOP์ ์ค์ ์์ฉ์ ๋ณด๋ ค๋ฉด ์ฝ๋๋ฅผ ๊น์ด ์ฐ๊ตฌํ๊ณ ์์ฑํด์ผ ํ๋ค.
class Avenger:
def __init__(self, name):
self.name = name
def fight(self):
print('๐')
spiderman = Avenger('Spiderman')
print(type(Avenger)) # <class 'type'>
print(type(spiderman)) # <class '__main__.Avenger'> --> instance of Avenger
ํ์ดํค์์ ํด๋์ค์ ๋ช
์นญ ์ฝ์ ์ ๋ํ ๋ด์ ๋์๋ฌธ์์ ๋จ์ ๋ช
์นญ์ด๊ณ ๋ณ์๋ ๋ฑ ๊ป์ง์ ์ฌ์ฉํด์ผ ํ๋ค.__init__
๋ ์ผ์ข
์ ์ด๊ธฐํ ๋ฐฉ๋ฒ(๊ตฌ์กฐ ํจ์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค)์ด๋ค.์ด๊ฒ์ ํด๋์ค์ ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.์์ ํด๋์ค์์name์ด ์ด๊ธฐํ๋๊ณ ์์ต๋๋ค.์๋ฅผ ๋ค์ด, JavaScript์์๋ ํด๋์ค์ ๊ตฌ์กฐ ํจ์์์ ์ด์ ์ ์ฌํ๊ฒ ์ํ๋ฉ๋๋ค.
self
๋ ํ์ดํค์ ํค์๋๋ก ํด๋์ค ์ค๋ก์ ๋ํ ์ธ์ฉ์ด๋ค.์ด๊ฒ์ ์ ๊ทผ ํด๋์ค์ ๋ณ์๋ ์์ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.๋ด ์ฌ์ง ๋ชจ๋ธ์์ ๋๋ ๊ทธ๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธthis
ํค์๋์ ๋น๊ตํ๋ค.์ด๋ฒค์ ธ์ค์์'์ ํฌ'๋ ์ด๋ฒค์ ธ์ค๊ฐ ์ ํฌ๋ฅผ ์๊ตฌ๋ฐ์ ๋ ๋ฌด์์ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฐ์์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.์ฌ๊ธฐ์๋ ์ด๋ชจํฐ์ฝ๋ง ์ธ์ํ ์ ์์ง๋ง, ์ด๋ค ๋์์ด๋ ํ ์ ์๋ค.
์ด ๋ณต์์๋ฅ๋ฅผ ์ํ์ผ๋ก ์ผ์ ์คํ์ด๋๋งจ ๋์์ ๋ง๋ค์์ต๋๋ค.๋ง์ฐฌ๊ฐ์ง๋ก ์ด ์ข ๋ฅ๋ ๋ค๋ฅธ ๋ณต์์๋ฅผ ๋ง๋ค ์ ์์ง๋ง, ๋ชจ๋๊ฐ ๋๊ฐ์ ์ผ์ ํ ๊ฒ ๊ฐ์์ ๊ทธ๋ค์๊ฒ ์ธ์ฐ๋ผ๊ณ ์๊ตฌํ๋ ๊ฒ์ ์ฟจํ์ง ์๋ค.
class Avenger:
def __init__(self, name, weapon):
self.name = name
self.weapon = weapon
def fight(self):
print(self.weapon)
spiderman = Avenger('Spiderman', 'dispatch a web')
thor = Avenger('Thor', 'thunder attack')
spiderman.fight() # dispatch a web
thor.fight() # thunder attack
์ด์ ์ข ๊ด์ฐฎ์์ก์ด์.๋ณต์์๋ง๋ค ๋
ํนํ ํผํฌ๋จผ์ค๊ฐ ์๋ค!์ด๊ฒ์ ๊ฐ๋จํ ์ ํ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ก ๋ง์ ๊ธฐ๋ฅ์ ์ฑ์ ๋ณต์์๋ฅผ ๋์ฑ ๋ณต์กํ๊ฒ ํ ์ ์๋ค.๋์์ ์ค๋กํํ ๋๋ง๋ค ๊ตฌ์กฐ ํจ์ ๋ฐฉ๋ฒ์ด๋ผ๋
__init_
๋ฅผ ํธ์ถํฉ๋๋ค.์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋๋ง ๋์์ ๋ง๋ค๊ฑฐ๋ ํ๋ผ๋ฏธํฐ์ ๊ธฐ๋ณธ๊ฐ์ ์ถ๊ฐํ ์ ์๋ ์ ์ด ๋ฉ์ปค๋์ฆ๋ ๋ง์ด ์ ๊ณตํ๋ค.
class MotorBike:
def __init__(self, brand, age):
if(age <= 15):
self.brand = brand
self.age = age
def start(self):
print(f'starting {self.brand}....')
bullet = MotorBike('Royal Enfield Bullet',20)
bullet.start() # error. object is created only if age is less than or equals 15
์ฝ๋ฉ ์ฐ์ต
์์ ์name๊ณผgoals ์์ฑ์ ๊ฐ์ง SoccerPlayer ํด๋์ค๋ฅผ ๋ง๋ค๊ณ 3๊ฐ์player ๋์์ ๋ง๋ค๊ณ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋ ๋ชฉํ๋ฅผ ์ฐพ์ ์ถ๋ ฅํ๋ ๊ฒ์ ๋๋ค.
class SoccerPlayer:
def __init__(self, name, goals):
self.name = name
self.goals = goals
def calculateMaxGoals(*args):
print(args)
return max(*args)
messi = SoccerPlayer('messi', 10)
ronaldo = SoccerPlayer('ronaldo',22)
neymar = SoccerPlayer('neymar', 8)
max_goals = calculateMaxGoals(messi.goals, ronaldo.goals, neymar.goals)
print(f'The highest number of goals is {max_goals} goals')
@classmethod์ @staticmethod
๋ฐฉ๋ฒ์ ํด๋์ค์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ํด๋์ค์ ์ค๋ก๋ฅผ ๋ง๋ค ํ์๊ฐ ์๋ค.์ด ์ ์ ํด๋ผ ์ ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
@classmethod
๋ฐฉ๋ฒ ์ด๋ฆ์ ๋งจ ์์ ์ด๋ฅธ๋ฐ ์ฅ์๊ธฐ@classmethod
๋ฅผ ์ถ๊ฐํ์ฌ ํด๋์ค์์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ํ์ฉํฉ๋๋ค.์ ์ ํ์ ๋๋ ์ฅ์๊ธฐ๋ฅผ ์์ธํ๊ฒ ์ฐ๊ตฌํ ๊ฒ์ด์ง๋ง, ํ์ฌ ๋๋ ๋จ์ง ์ฐฝ์ค ์ ํ์ ๊ฐ๋ ์ ๋์ฒด์ ์ผ๋ก ์ดํดํ์ ๋ฟ์ด๋ค.
class Calculator:
def __init__(self,type):
self.type = type
@classmethod
def calculate_sum(cls, num1, num2):
return num1 + num2
# cls is just like self which needs to passed as 1st parameter
print(Calculator.calculate_sum(3,5)) # 8
@staticmethod
์ @classmethod
๋ ๋งค์ฐ ๋น์ทํ๋ค.ํค์๋๋ฅผ ์ ๋ฌํ ํ์๊ฐ ์์ต๋๋คcls
.์ด ๋ฐฉ๋ฒ์ ์ค๋กํ๋์ง ์์ ์ํฉ์์ ํธ์ถํ ์ ์์ต๋๋ค.class Calculator:
def __init__(self,type):
self.type = type
@staticmethod
def multiply(num1, num2):
return num1 * num2
# cls is just like self which needs to passed as 1st parameter
print(Calculator.multiply(3,5)) # 15
์ค๋์ ์ฌ๊ธฐ๊น์ง.๋๋ ๋์์ ๋์์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ๋ ์๋ฆฌ๋ฅผ ์์ธํ๊ฒ ์๊ฐํ๊ณ ํ์ํ๋ฉฐ ๊ฐ๋
์ ์ดํดํ๋ ๊ณผ์ ์์ ์ฐ์ต์ ํ ๊ฒ์ด๋ค.์ฌ์ง ๋ชจํ์ ์์ผ๋ก ๋ฉฐ์น ๋์ ๋ ๋์ ์ฃผ์ ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋๋ฆฌ๊ณ ์์ ์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์๋ค.๋๋ ์ฌ๋ฐ์์ผ๋ฉด ์ข๊ฒ ์ด.
๋๋ ํ์ดํค์ ์ฐฝ์์์ ํจ๊ป ์ด ์ฌ๋ฏธ์๋ ํด์ฆ ์์์ ๋ณด๊ณ ์๋ค.๊ณต์ ํ๊ณ ์ถ๋ค:)
์ธ์ฝ๋ฉ์ ๊ณ์ํฉ๋๋ค.๋ ์๊ฐ์ ์๋ ค์ค.
์ฆ๊ฑฐ์ด ์๊ฐ ๋ณด๋ด์ธ์!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(Python 30์ผ๐จโ๐ป - 8์ผ์ฐจ-OOP ๊ธฐ๋ณธ ์ฌํญ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/arindamdawn/30-days-of-python-day-8-oop-basics-3caiํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค