CodeGym /ํ–‰๋™ /Python SELF KO /๊ณ„์ธต ์ดˆ๊ธฐํ™”

๊ณ„์ธต ์ดˆ๊ธฐํ™”

Python SELF KO
๋ ˆ๋ฒจ 16 , ๋ ˆ์Šจ 1
์‚ฌ์šฉ ๊ฐ€๋Šฅ

7.1 super() ๋ฉ”์„œ๋“œ

์ƒ์† ๊ณ„์ธต์„ ์–˜๊ธฐํ•˜๋Š” ๊น€์—, ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ๋“ค์„ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฑฐ์•ผ. Python์—๋Š” ์ด๊ฑธ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ super()๊ฐ€ ์žˆ์–ด. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ํด๋ž˜์Šค ๋‚ด์—์„œ ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉ๋ผ.

์ด ๋ฉ”์„œ๋“œ๋Š” ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์–ด:

๋ถ€๋ชจ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ:

super() ๋ฉ”์„œ๋“œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค˜, ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์–ด. ํŠนํžˆ ๋‹ค์ค‘ ์ƒ์†์„ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•˜๊ณ , ํด๋ž˜์Šค ๊ณ„์ธต์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ผ.

๊ธฐ๋ณธ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”:

super()๋Š” ์ž์‹ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋ผ, ์ด๋Š” ์ž์‹ ํด๋ž˜์Šค ๋‚ด์—์„œ ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค˜.

๋‹ค์ค‘ ์ƒ์† ์ง€์›:

๋‹ค์ค‘ ์ƒ์†์˜ ๊ฒฝ์šฐ super()๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ์ˆœ์„œ(MRO, Method Resolution Order)๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด๊ฒฐํ•ด, ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์„ ํ˜ธ๋ผ. ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ๋‚˜์ค‘์— ๋” ์–˜๊ธฐํ•  ๊ฑฐ์•ผ.

7.2 ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž

๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•ด. ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•„. ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ํ•ญ์ƒ ๋ช…์‹œ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์ข…์ข… ํŠน๋ณ„ํ•œ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์•ผ.

์˜ˆ์‹œ:


class Animal:
    def __init__(self, type, name):
        self.type = type
        self.name = name
         
        
class Dog(Animal):
    def __init__(self, name):
        super().__init__("๊ฐœ", name)  # ๊ธฐ๋ณธ ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ
        
class Cat(Animal):
    def __init__(self, name):
        super().__init__("๊ณ ์–‘์ด", name)  # ๊ธฐ๋ณธ ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ
        
        
# Dog ๊ฐ์ฒด ์ƒ์„ฑ
dog = Dog("Buddy")
print(dog) 

์ด ์˜ˆ์‹œ์—์„œ ๊ธฐ๋ณธ ํด๋ž˜์Šค (Animal)์˜ ์ƒ์„ฑ์ž๋Š” ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ: ๋™๋ฌผ์˜ ํƒ€์ž…๊ณผ ๊ทธ ์ด๋ฆ„. ๊ทธ๋ฆฌ๊ณ  ์ƒ์† ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ โ€” ์ด๋ฆ„.

๋ฐ”๋กœ Dog์™€ Cat ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ ๊ธฐ๋ณธ ํด๋ž˜์Šค ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•  ๊ฒƒ์ด ๊ฒฐ์ •๋ผ โ€” ๋™๋ฌผ์˜ ํƒ€์ž… ์ด๋ฆ„์ธ "๊ฐœ"์™€ "๊ณ ์–‘์ด".

๊ทธ๋ž˜์„œ:

  • ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋Š” ์ƒ์† ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœํ•ด์•ผ ํ•ด.
  • ์ด๋ฅผ ์œ„ํ•ด super() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด.
  • self ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋”ฐ๋กœ ์ „๋‹ฌํ•  ํ•„์š”๋Š” ์—†์–ด โ€” Python์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋Œ€์ž…ํ•ด ์ค„ ๊ฑฐ์•ผ.

7.3 super() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

super() ๋ฉ”์„œ๋“œ๋Š” Python์—์„œ ์ƒ์„ฑ์ž๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋•Œ ์ด๊ฒŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž:

์ž์‹ ๋ฉ”์„œ๋“œ์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

์ด ์˜ˆ์‹œ์—์„œ Dog ํด๋ž˜์Šค์˜ speak() ๋ฉ”์„œ๋“œ๋Š” ๋จผ์ € super()๋ฅผ ํ†ตํ•ด Animal ํด๋ž˜์Šค์˜ speak() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ์— ์ž์ฒด ํ–‰๋™์„ ์ถ”๊ฐ€ํ•ด.


class Animal:
    def speak(self):
        return "์–ด๋–ค ์ผ๋ฐ˜์ ์ธ ๋™๋ฌผ์˜ ์†Œ๋ฆฌ"
        

class Dog(Animal):
    def speak(self):
        parent_speech = super().speak()  # ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
        return f"{parent_speech} ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๊ฐ€ ์ง–์–ด!"
        
dog = Dog()
print(dog.speak())  # ์ถœ๋ ฅ: ์–ด๋–ค ์ผ๋ฐ˜์ ์ธ ๋™๋ฌผ์˜ ์†Œ๋ฆฌ ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๊ฐ€ ์ง–์–ด!

๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒํƒœ ํ™•์ธ

์ด ์˜ˆ์‹œ์—์„œ Dog ํด๋ž˜์Šค์˜ check_health() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Animal ํด๋ž˜์Šค์˜ check_health() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด.


class Animal:
    def check_health(self):
        return "๋™๋ฌผ์ด ๊ฑด๊ฐ•ํ•ด"
        

class Dog(Animal):
    def check_health(self):
        parent_check = super().check_health()  # ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
        return f"{parent_check}. ๊ฐœ๊ฐ€ ์‚ฐ์ฑ…์ด ํ•„์š”ํ•ด!"
        
dog = Dog()
print(dog.check_health())  # ์ถœ๋ ฅ: ๋™๋ฌผ์ด ๊ฑด๊ฐ•ํ•ด. ๊ฐœ๊ฐ€ ์‚ฐ์ฑ…์ด ํ•„์š”ํ•ด!

์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

์ด ์˜ˆ์‹œ์—์„œ SavingsAccount ํด๋ž˜์Šค์˜ withdraw() ๋ฉ”์„œ๋“œ๋Š” ๋จผ์ € ์ธ์ถœ ํ•œ๋„๊ฐ€ ์ดˆ๊ณผ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•œ ๋‹ค์Œ, ์ดˆ๊ณผ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด BankAccount ํด๋ž˜์Šค์˜ withdraw() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด.


class BankAccount:
    def __init__(self, balance):
        self.balance = balance
        

    def withdraw(self, amount):
        if self.balance >= amount:
            self.balance -= amount
            return f"{amount} ์ธ์ถœํ–ˆ์–ด. ์ƒˆ๋กœ์šด ์ž”์•ก: {self.balance}"
        return "์ž”์•ก ๋ถ€์กฑ"
        

class SavingsAccount(BankAccount):
    def withdraw(self, amount):
        if amount > 1000:
            return "์ธ์ถœ ํ•œ๋„ ์ดˆ๊ณผ"
        return super().withdraw(amount)  # ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
        

savings = SavingsAccount(1500)
print(savings.withdraw(500))  # ์ถœ๋ ฅ: 500 ์ธ์ถœํ–ˆ์–ด. ์ƒˆ๋กœ์šด ์ž”์•ก: 1000
print(savings.withdraw(1500))  # ์ถœ๋ ฅ: ์ธ์ถœ ํ•œ๋„ ์ดˆ๊ณผ
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION