프로그래밍백엔드 개발자

Java에서 'super' 키워드가 작동하는 방식, 올바르게 적용하는 방법 및 사용 시 발생할 수 있는 함정에 대해 설명하세요.

Hintsage AI 어시스턴트로 면접 통과

답변.

문제의 역사:

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를 사용하는 것 — 컴파일 오류 발생
  • 기본 클래스가 특별한 초기화를 요구하는 경우 super() 호출 누락

실생활 예시

부정적인 케이스

개발자가 파생 클래스의 생성자에서 super()를 명시적으로 호출하는 것을 잊어버리고, 슈퍼 클래스에 기본 생성자가 없습니다.

장점:

  • 없음

단점:

  • 컴파일 오류, 객체 생성 불가능

긍정적인 케이스

서브클래스에서 재정의된 메서드는 먼저 super 구현을 호출한 다음 추가 논리로 확장합니다.

장점:

  • 기본 동작이 유지되고, 여기에 새로운 기능을 추가하기 편리합니다.

단점:

  • 슈퍼클래스가 변경되면 예상치 못한 부작용이 쉽게 발생할 수 있으므로 메서드 계약을 주의 깊게 살펴봐야 합니다.