다른건 아니고 그냥 하면서 조금 배운 부분이 있어서 풀어볼까 합니다.
상속에서 super().입니다.
1. super()는 무엇인가?
super()는 부모 클래스의 메서드나 속성에 접근하기 위한 Python의 내장 함수입니다. 자식 클래스에서 부모 클래스의 메서드나 속성에 접근하고자 할 때 사용됩니다.
super()는 자식 클래스에서 부모 클래스의 메서드나 속성을 호출할 때 사용하는 특별한 방법입니다.
super()를 사용하면 자식 클래스가 어떤 부모 클래스에서 상속받았는지 파악하고, 해당 부모 클래스의 메서드를 호출할 수 있습니다.
2. 왜 super()를 사용하나요?
자식 클래스에서 부모 클래스의 메서드나 초기화 기능을 재사용하고자 할 때 사용합니다. 이 방법은 중복된 코드 작성을 피하고, 부모 클래스의 기능을 확장할 수 있게 도와줍니다.
class Animal: def __init__(self, name): self.name = name def speak(self): print(f"{self.name} makes a sound!") class Dog(Animal): def __init__(self, name, breed): # super()로 부모 클래스의 __init__ 호출 super().__init__(name) # 부모 클래스의 __init__ 메서드를 호출 self.breed = breed def speak(self): print(f"{self.name} barks!") # 객체 생성 dog = Dog("Buddy", "Golden Retriever") dog.speak() # Buddy barks!
3. super().__init__(name)에서 __init__는 왜 함께 쓰는 것인가?
super()는 부모 클래스의 메서드를 호출하는 역할을 합니다. 부모 클래스에서 __init__ 메서드가 정의되어 있으므로, 자식 클래스에서 super().__init__(name)를 호출하면 부모 클래스의 __init__ 메서드가 실행됩니다.
여기서 중요한 점은:
super().__init__(name)는 부모 클래스의 __init__ 메서드를 호출하는 것입니다.
__init__ 메서드는 객체가 생성될 때 초기화하는 역할을 합니다. 그래서 super()를 통해 부모 클래스의 __init__ 메서드를 호출하여 부모 클래스에서 정의한 초기화 작업도 함께 실행합니다.
이렇게 하면 자식 클래스는 부모 클래스의 초기화 메서드를 호출하고, 부모 클래스에서 정의된 속성을 그대로 사용할 수 있게 됩니다.
그런데 super().을 안 쓰는 경우도 있던데 뭔가요?
만약 자식 클래스에서 부모 클래스의 변수만 사용할 경우, super()를 사용하지 않아도 됩니다. super()는 주로 부모 클래스의 메서드를 호출할 때 사용되기 때문에, 단순히 부모 클래스의 속성(변수)을 상속받고 사용하고자 할 때는 super() 없이 직접 접근해도 문제가 없습니다.
super() 없이 변수만 사용하는 경우
class Animal: def __init__(self, name): self.name = name # 부모 클래스의 변수 class Dog(Animal): def __init__(self, name, breed): self.name = name # 부모 클래스의 변수에 직접 접근 self.breed = breed def speak(self): print(f"{self.name} barks!") # 객체 생성 dog = Dog("Buddy", "Golden Retriever") print(dog.name) # "Buddy" print(dog.breed) # "Golden Retriever"
Dog 클래스에서 name 속성은 부모 클래스 Animal의 __init__에서 설정된 변수입니다.
Dog 클래스의 __init__에서 self.name = name을 직접 할당하고 있기 때문에, super().__init__(name)을 사용할 필요가 없습니다.
변수에만 접근하고 초기화하는 경우에는 super() 없이도 부모 클래스의 속성을 사용할 수 있습니다.
반대로, 부모 클래스의 메서드를 호출하거나 부모 클래스의 초기화 메서드를 호출하려면 super()를 사용해야 합니다. 예를 들어, 부모 클래스에서 메서드를 오버라이드(재정의)하지 않고 그대로 사용하고자 할 때 super()를 이용해 부모 클래스의 메서드를 호출합니다.
class Dog(Animal): def __init__(self, name, breed): super().__init__(name) # 부모 클래스의 __init__ 호출 (super() 사용) self.breed = breed def speak(self): super().speak() # 부모 클래스의 speak() 메서드를 호출 print(f"{self.name} barks!") # 객체 생성 dog = Dog("Buddy", "Golden Retriever") dog.speak() # 부모 클래스의 speak() 호출 후 자식 클래스에서 추가 동작
부모 클래스의 변수에 단순히 접근하거나 초기화하는 경우에는 super()를 사용하지 않아도 됩니다.
부모 클래스의 메서드를 호출하거나, 부모 클래스의 __init__ 메서드를 호출하고자 할 때는 super()를 사용해야 합니다.