profile-img
The merit of an action lies in finishing it to the end.
slide-image

class & self

class(클래슀)λž€, 데이터와 κΈ°λŠ₯이 ν•¨κ»˜ λ¬Άμ—¬ μžˆλŠ” ν•˜λ‚˜μ˜ 틀이닀. 이 틀을 μ΄μš©ν•˜μ—¬ μ—¬λŸ¬ 개의 object(객체)λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. 각각의 κ°μ²΄λŠ” λ…λ¦½μ μ΄μ–΄μ„œ μ„œλ‘œμ—κ²Œ 영ν–₯을 주지 μ•ŠλŠ”λ‹€.

 

μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ 예λ₯Ό λ“€μ–΄ 보자.

ν΄λž˜μŠ€λŠ” μ΄ˆμ½œλ¦Ώμ„ λ§Œλ“œλŠ” ν‹€κ³Ό κ°™λ‹€. 녹은 μ΄ˆμ½œλ¦Ώμ„ 틀에 λΆ€μ–΄ μ΄ˆμ½œλ¦Ώμ„ λ¬΄ν•œμ • 생산할 수 μžˆλ‹€. 이 ν‹€λ‘œ λ§Œλ“€μ–΄μ§„ 각각의 μ΄ˆμ½œλ¦Ώμ„ 객체라고 μƒκ°ν•˜λ©΄ λœλ‹€.

각각의 μ΄ˆμ½œλ¦Ώμ€ λ…λ¦½μ μ΄λ―€λ‘œ μ΄ˆμ½œλ¦Ώμ— μ–΄λ–€ λ°μ½”λ ˆμ΄μ…˜μ„ μ˜¬λ¦¬λ”λΌλ„ λ‹€λ₯Έ μ΄ˆμ½œλ¦Ώμ—λŠ” 영ν–₯을 주지 μ•ŠλŠ”λ‹€.

 

클래슀λ₯Ό μ΄μš©ν•˜λ©΄ 같은 κΈ°λŠ₯을 ν•˜λŠ” 독립적인 μ—¬λŸ¬ 객체λ₯Ό 생성할 수 있기 λ•Œλ¬Έμ— νŽΈλ¦¬ν•˜λ‹€. 일기μž₯ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄μ•Ό ν•˜λŠ”λ°, μ‚¬λžŒλ§ˆλ‹€ λ‹€λ₯Έ 일기μž₯을 λ§Œλ“€μ–΄μ€„ λ•Œ 이걸 일일이 μ½”λ“œλ‘œ μž‘μ„±ν•˜λ©΄ μ‹œκ°„λ‚­λΉ„, 그리고 μžμ›λ‚­λΉ„(!)이기 λ•Œλ¬Έμ΄λ‹€.

 

ν΄λž˜μŠ€μ™€ κ°μ²΄λŠ” λ‹€μŒκ³Ό 같이 생성할 수 μžˆλ‹€.

class chocoMaker:
	pass
    
a = chocoMaker() # a 객체 생성
b = chocoMaker() # b 객체 생성

아직 chocoMakerλΌλŠ” ν΄λž˜μŠ€μ— 아무 κ°’μ΄λ‚˜ κΈ°λŠ₯이 ν¬ν•¨λ˜μ–΄μžˆμ§€ μ•Šλ‹€.

ν΄λž˜μŠ€μ— ν•¨μˆ˜λ₯Ό ν¬ν•¨μ‹œν‚€λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

class chocoMaker:
    def decorate(self, color, type):
    	self.color = color
        self.type = type
        
a = chocoMaker()
a.decorate('white', 'sprinkle')

클래슀 λ‚΄λΆ€μ˜ ν•¨μˆ˜λŠ” method(λ©”μ„œλ“œ)라고 λΆ€λ₯Έλ‹€.

λ©”μ„œλ“œμ˜ 첫 번째 λ§€κ°œλ³€μˆ˜λŠ” λŒ€κ°œ selfλ₯Ό μ“΄λ‹€. self의 역할은 객체 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” 것이닀.

객체λ₯Ό μƒμ„±ν•˜κ³  λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” μœ„μ™€ 같이 객체.λ©”μ„œλ“œ(...) 이런 μ‹μœΌλ‘œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€. 그런데 첫 번째 λ§€κ°œλ³€μˆ˜μ˜€λ˜ selfλŠ” μ‹€μ œλ‘œ μ‚¬μš©ν•  λ•Œ μž…λ ₯ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. 객체.λ©”μ„œλ“œ(...)μ—μ„œ 객체가 self둜 μžλ™μœΌλ‘œ μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ§Œμ•½ 이 방법이 λ§ˆμŒμ— 듀지 μ•ŠλŠ”λ‹€λ©΄ μ•„λž˜μ™€ 같이 μž‘μ„±ν•΄λ„ λœλ‹€.

a = chocoMaker()
chocoMaker.decorate(a, 'white', 'sprinkle')

decorate λ©”μ„œλ“œμ˜ μˆ˜ν–‰λ¬Έμ„ μ‚΄νŽ΄λ³΄μž.

a.decorate('white', 'sprinkle')κ³Ό 같이 μž‘μ„±ν•˜λ©΄, aλΌλŠ” 객체 내뢀에 color, type κ°μ²΄λ³€μˆ˜κ°€ μƒμ„±λ˜κ³ , 'white', 'sprinkle'값이 μ €μž₯λœλ‹€.

클래슀둜 λ§Œλ“  μ—¬λŸ¬ 가지 객체 κ°„μ—” 독립성이 보μž₯λ˜λ―€λ‘œ, ν•œ 객체의 κ°μ²΄λ³€μˆ˜μ˜ 값을 μˆ˜μ •ν–ˆλ‹€κ³  ν•˜μ—¬ λ‹€λ₯Έ 객체의 κ°μ²΄λ³€μˆ˜ 값이 달라지지 μ•ŠλŠ”λ‹€.

 

init/μƒμ„±μž

chocoMaker ν΄λž˜μŠ€μ— λ‹€λ₯Έ λ©”μ„œλ“œλ„ μΆ”κ°€ν•΄λ³΄μž.

class chocoMaker:
    def decorate(self, color, type):
    	self.color = color
        self.type = type
    def plate(self):
    	res = self.color + self.type
        return res

plate λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ˜€λ‹€. 이 μƒν™©μ—μ„œ λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

b = chocoMaker()
b.plate()

μ΄μœ λŠ” μ•žμ„œ λ§Œλ“€μ–΄λ‘μ—ˆλ˜ decorate λ©”μ„œλ“œλ₯Ό κ±°μΉ˜μ§€ μ•Šκ³ λŠ” plate λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

ν•˜μ§€λ§Œ decorate μˆ˜ν–‰ ν›„ plateλ₯Ό μˆ˜ν–‰ν•˜λ„λ‘ ν•˜λ©΄ λΆˆνŽΈν•˜λ‹€. ν•œ λ²ˆμ— ν•΄κ²°ν•  수 μžˆλŠ” 방법이 μ—†μ„κΉŒ?

μš°λ¦¬λŠ” 이럴 λ•Œ μƒμ„±μž(constructor)λ₯Ό μ‚¬μš©ν•œλ‹€. μƒμ„±μžλŠ” 객체λ₯Ό 생성할 λ•Œ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œλ₯Ό μ˜λ―Έν•œλ‹€. __init__으둜 μ‚¬μš©ν•  수 μžˆλ‹€.

λ‹€μŒ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

class chocoMaker:
    def __init__(self, color, type):
        self.color = color
        self.type = type
    def decorate(self, color, type):
    	self.color = color
        self.type = type
    def plate(self):
    	res = self.color + self.type
        return res

c = chocoMaker('pink', 'decopen')

cλΌλŠ” 객체λ₯Ό λ§Œλ“€ λ•Œ, decorateλ₯Ό 뢈러올 ν•„μš” 없이 chocoMaker와 ν•¨κ»˜ μ›ν•˜λŠ” 값을 전달할 수 μžˆλ‹€.

 

상속

μ½”λ“œλ₯Ό μ§œλ‹€ 보면 같은 속성을 κ°–λŠ” μƒˆλ‘œμš΄ 클래슀λ₯Ό 생성해야 ν•  ν•„μš”κ°€ μžˆλ‹€.

예λ₯Ό λ“€μ–΄, 색깔과 λ°μ½”λ ˆμ΄μ…˜μ˜ μ’…λ₯˜λ§Œμ„ κ°–λŠ” chocoMaker ν΄λž˜μŠ€μ—μ„œ λ°μ½”λ ˆμ΄μ…˜μ˜ 개수λ₯Ό μΆ”κ°€ν•œ 클래슀λ₯Ό μƒˆλ‘œ λ§Œλ“œλŠ” 경우λ₯Ό μƒκ°ν•΄λ³΄μž.

μƒˆλ‘œμš΄ 클래슀λ₯Ό μƒμ„±ν•˜λŠ” 것보닀 기쑴의 chocoMaker 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ λ§Œλ“œλŠ” 편이 훨씬 κ°„λ‹¨ν•˜λ‹€. 이럴 λ•Œ μ΄μš©ν•˜λŠ” 것이 super().__init__λ₯Ό μ΄μš©ν•œ 상속이닀.

class superChocoMaker(chocoMaker):
    def __init__(self, color, type, num): # num μΆ”κ°€
        super().__init__(color, type)
        self.num = num
        
    def superPlate(self): # κΈ°μ‘΄ 클래슀의 λ©”μ„œλ“œλ₯Ό 상속
        super().plate()

클래슀λ₯Ό 생성할 λ•Œ 클래슀 μ˜† κ΄„ν˜Έ μ•ˆμ— 상속할 클래슀의 이름을 적어둔 λ‹€μŒ, super().__init__의 input으둜 상속할 κΈ°μ‘΄ 클래슀의 μš”μ†Œμ˜ 이름을 적어쀀닀.

λ•Œλ‘œλŠ” μƒˆλ‘œ λ§Œλ“  ν΄λž˜μŠ€μ—μ„œ 기쑴의 λ©”μ„œλ“œμ™€ 같은 이름을 μ‚¬μš©ν•˜μ§€λ§Œ λ‹€λ₯Έ κΈ°λŠ₯을 ν•˜λŠ” λ©”μ„œλ“œλ₯Ό λ§Œλ“€κ³  싢을 수 μžˆλ‹€. 그럴 λ•Œμ—λŠ” κ·Έλƒ₯ 상속받은 (μƒˆλ‘œ λ§Œλ“ ) 클래슀 λ‚΄λΆ€μ—μ„œ λ©”μ„œλ“œλ₯Ό λ‹€μ‹œ μ •μ˜ν•˜λ©΄ λœλ‹€.

κΈ°μ‘΄ 클래슀의 λ©”μ„œλ“œλ₯Ό 상속받고 싢을 λ•ŒλŠ” super().λ©”μ„œλ“œμ™€ 같은 λ°©μ‹μœΌλ‘œ μž‘μ„±ν•œλ‹€.

'CS study/파이썬 기초' Related Articles +