
자바 프로그래밍에서 상속(Inheritance)을 공부하다 보면 필연적으로 마주치는 두 키워드가 있습니다. 바로 super와 super()입니다. 이름은 비슷하지만, 하나는 참조 변수이고 다른 하나는 생성자 호출문이라는 명확한 차이가 있습니다. 이 두 개념을 혼동하면 코드의 가독성이 떨어질 뿐만 아니라, 런타임에서 의도치 않은 버그를 발생시킬 수 있습니다. 오늘은 자바의 객체 지향 원리를 깊이 있게 이해하기 위해 super와 super()의 정의부터 실무 활용법, 그리고 주의사항까지 핵심 내용을 정리해 보겠습니다.
1. super: 부모의 멤버에 접근하는 '참조 변수'
super는 자식 클래스에서 부모 클래스로부터 상속받은 멤버(필드, 메서드)를 참조하는 데 사용되는 참조 변수입니다. 주로 부모 클래스의 멤버와 자식 클래스의 멤버가 이름이 같을 때, 이를 구분하기 위해 사용됩니다.
언제 사용하는가?
- 필드 이름이 중복될 때: 자식 클래스에서 부모 클래스와 동일한 이름의 변수를 선언(Shadowing)했을 경우,
super.variable을 통해 부모의 변수에 접근합니다. - 메서드 오버라이딩 시: 부모의 메서드를 재정의했지만, 여전히 부모의 원본 로직을 호출해야 할 때
super.method()를 사용합니다.
2. super(): 부모의 '생성자'를 호출하는 마법
super()는 부모 클래스의 생성자를 호출하는 문법입니다. 자식 객체를 생성할 때, 자식의 내부에 포함된 부모의 상태를 먼저 초기화하기 위해 반드시 필요합니다.
중요한 규칙
- 첫 줄의 원칙:
super()는 자식 생성자의 반드시 첫 번째 줄에 위치해야 합니다. (단,this()가 첫 줄에 있다면 생략 가능) - 기본 생성자의 자동 삽입: 개발자가 직접
super()를 작성하지 않으면, 컴파일러가 자동으로super();를 생성자 첫 줄에 추가합니다. - 명시적 호출의 필요성: 부모 클래스에 기본 생성자가 없고 매개변수가 있는 생성자만 있다면, 자식 클래스에서 반드시 명시적으로
super(인자);를 호출해야 컴파일 에러가 나지 않습니다.
3. super vs super() 비교 요약
두 개념의 결정적인 차이점을 표를 통해 비교해 보겠습니다.
| 구분 | super | super() |
|---|---|---|
| 본질 | 부모 인스턴스를 가리키는 참조 변수 | 부모의 생성자를 호출하는 문장 |
| 사용 목적 | 부모의 필드나 메서드에 접근 | 부모의 초기화 로직 실행 |
| 제약 사항 | static 메서드 내 사용 불가 | 생성자 내 첫 줄에서만 사용 가능 |
| 형태 | super.멤버명 | super(매개변수, ...) |
4. 실무에서의 활용 팁
객체 지향 설계를 할 때 super를 효과적으로 활용하는 방법은 다음과 같습니다.
"확장(Extend)이지 대체(Replace)가 아니다"
메서드 오버라이딩 시 부모의 기능을 완전히 무시하기보다는,super.method()를 호출하여 기존 로직을 실행한 뒤 자식 클래스만의 특화된 로직을 추가하는 방식으로 코드를 작성하는 것이 유지보수에 유리합니다.
5. 마치며
super와 super()는 자바 상속 시스템의 기둥과 같습니다. super를 통해 부모의 유산을 활용하고, super()를 통해 부모로부터 안전하게 객체를 태어나게 합니다. 이 두 가지 차이를 명확히 인지하고 활용한다면, 보다 견고하고 계층적인 자바 애플리케이션을 설계할 수 있을 것입니다.
내용 출처
- Oracle Java Language Specification - Section 15.11.2 (Accessing Superclass Members)
- Herbert Schildt, Java: The Complete Reference, Eleventh Edition
'Language > Java' 카테고리의 다른 글
| [JAVA] 다형성(Polymorphism) 완벽 이해 : 객체 지향의 마법을 부리는 방법 (0) | 2026.01.15 |
|---|---|
| [JAVA] 메서드 오버라이딩 vs 오버로딩 : 자바 다형성의 두 얼굴 완벽 가이드 (0) | 2026.01.15 |
| [JAVA] Java 상속(Inheritance)을 사용하는 이유와 제한 사항: 효율적인 객체 지향 설계를 위한 가이드 (0) | 2026.01.15 |
| [JAVA] this와 this()의 결정적 차이: 자바 객체 지향의 Detail 완성하기 (0) | 2026.01.15 |
| [JAVA] 생성자 오버로딩 : 유연한 객체 생성을 위한 설계의 미학 (0) | 2026.01.15 |