문제의 역사:
Java의 초기 버전에는 자식 클래스가 부모 클래스의 동작을 확장할 수 있는 상속 메커니즘이 포함되었습니다. 부모 클래스의 구성원에 접근하기 위해 super 키워드가 사용되며, 이는 C++에서 유래되었습니다.
문제:
부모 클래스의 메서드나 필드가 재정의되거나 숨겨진 경우, 명시적으로 접근해야 할 필요가 생기는 경우가 있습니다. super를 올바르게 사용하지 않으면 오류나 비정상적인 동작이 발생할 수 있으며, 예를 들어 생성자를 사용할 때 문제가 발생할 수 있습니다.
해결책:
super를 사용하여:
예:
class Animal { void makeSound() { System.out.println("Animal sound"); } } class Dog extends Animal { void makeSound() { super.makeSound(); // Animal sound System.out.println("Bark"); } }
주요 특징:
super를 생성자의 첫 번째 줄이 아닐 때 호출할 수 있나요?
아니요. super()를 사용한 부모 생성자 호출은 항상 생성자의 첫 번째 줄이어야 합니다. 이 제한을 위반하면 컴파일러가 오류를 발생시킵니다.
정적 메서드나 컨텍스트에서 super를 사용할 수 있습니까?
아니요. super 키워드는 객체의 계층에 관련되기 때문에 비정적(인스턴스) 컨텍스트에서만 사용할 수 있습니다.
super를 통해 부모의 프라이빗 메서드에 접근할 수 있나요?
아니요. 프라이빗 메서드는 자손에게 보이지 않으며 — super를 통해서도 접근할 수 없습니다. 오직 public, protected 및 package-private 메서드 또는 필드만 super를 통해 접근할 수 있습니다.
개발자가 파생 클래스의 생성자에서 super()를 명시적으로 호출하는 것을 잊어버리고, 슈퍼 클래스에 기본 생성자가 없습니다.
장점:
단점:
서브클래스에서 재정의된 메서드는 먼저 super 구현을 호출한 다음 추가 논리로 확장합니다.
장점:
단점: