오늘은 오랜만에 프로그램 문서를 좀 보면서 C++, java, python을 좀 비교해보는 시간이 있었습니다.
개인적으로는 C++를 좋아하지만, python의 업무 효율성이 좋아 많이 쓰는 편이지요..
그 와중에 클래스 특히 super() 라는 함수 활용 중 제가 오해한 진실과 조금 애매한 부분을 정리해 보려 합니다.
가볍게 읽어 주세요
Python에서 super() 함수는 상속 관계에서 부모 클래스의 메서드를 호출할 수 있게 도와주는 함수입니다. 이를 통해 자식 클래스에서 부모 클래스의 메서드를 쉽게 호출할 수 있습니다. super()는 주로 다중 상속과 관련이 있지만, 단일 상속에서도 유용하게 사용됩니다.
1. 기본 개념
super()는 부모 클래스의 메서드를 호출하고, 자식 클래스에서 오버라이딩된 메서드를 호출할 때 부모 클래스의 메서드를 명시적으로 호출할 수 있게 해줍니다.
[사용] super().method()
여기서 super()는 현재 클래스의 부모 클래스에 대한 참조를 반환하며, method()는 호출하려는 부모 클래스의 메서드입니다. super()를 사용하면 부모 클래스의 메서드가 자식 클래스에서 오버라이딩된 메서드에 의해 자동으로 호출되는 것을 방지하고, 부모 클래스의 메서드를 명시적으로 호출할 수 있습니다.
2. 다중 상속에서의 역할
Python에서 클래스는 다중 상속을 지원합니다. 이때 super()는 부모 클래스들 중 어느 클래스를 먼저 호출할지 결정하는 데 유용합니다. super()는 메서드 접근순서(Method Resolution Order, MRO)라고 불리는 순서를 따릅니다. super()는 클래스 계층에서 상속 관계를 따라가며, 여러 부모 클래스에서 메서드를 호출할 수 있게 합니다.
3. 사용 사례
3.1. 단일 상속에서의 super()
먼저 단일 상속에서 super()의 기본적인 사용 예를 보여드리겠습니다.
위 코드는
Animal makes a sound
Dog barks
과 같은 출력이 나온답니다.이 예제에서 Dog 클래스는 Animal 클래스를 상속받고, speak() 메서드를 오버라이딩합니다. super().speak()를 호출함으로써 부모 클래스인 Animal의 speak() 메서드를 호출하고, 그 후에 자식 클래스에서 추가적인 행동을 합니다.
3.2. 다중 상속에서의 super()
다중 상속에서는 super()가 더 복잡하게 동작합니다. MRO가 중요한 역할을 하며, super()는 메서드를 호출할 때 MRO를 따라갑니다. MRO는 클래스의 메서드를 호출할 순서를 정의한 리스트입니다. MRO를 확인하려면 .__mro__를 사용하거나, mro() 메서드를 사용할 수 있습니다.
위 결과는 아래와 같이 나옵니다
Class A speaks
Class C speaks
Class B speaks
Class D speaks
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
이 예제에서는 D 클래스가 B와 C를 상속하고 있습니다. super()는 MRO를 따라 A, C, B의 순서로 메서드를 호출합니다. D 클래스의 speak() 메서드는 super().speak()를 호출하여 MRO 순서대로 메서드를 실행하게 됩니다.
3.3. super()를 사용한 __init__() 메서드 호출
super()는 생성자(__init__())를 호출할 때도 유용합니다. 부모 클래스의 생성자를 호출하여 초기화 작업을 재사용할 수 있습니다.
결과는 아래와 같이 나옵니다
Animal created: Buddy
Dog breed: Golden Retriever
위 예제에서 Dog 클래스는 Animal 클래스의 __init__() 메서드를 호출하여 이름을 설정하고, Dog 클래스에서만 정의된 breed 속성을 추가로 설정합니다.
4. 결론
- super()는 주로 부모 클래스의 메서드를 자식 클래스에서 호출할 때 사용됩니다.
- 다중 상속을 사용할 때 super()는 메서드 해결 순서(MRO)를 따르며, 부모 클래스들이 여러 개 있을 때 유용하게 사용됩니다.
- super()는 __init__()과 같은 초기화 메서드에서 부모 클래스의 초기화 작업을 재사용하는 데에도 사용됩니다.
super()는 코드 중복을 줄이고, 상속 계층에서의 코드 유지보수를 용이하게 합니다.
'IT Data 분석' 카테고리의 다른 글
AI 연구개발의 현재: 혁신적인 변화의 중심에 서다 (0) | 2025.01.21 |
---|---|
양자컴퓨터의 원리와 미래 (0) | 2024.12.16 |
visual studio code의 java 설정(in Mac) (0) | 2024.11.30 |
인터넷과 블록체인 혁명: 디지털 미래를 여는 두 개의 열쇠 (0) | 2024.11.07 |
React: State와 Effect의 차이 (0) | 2024.10.24 |