Java super와 super() 상속 초보자도 이해하는 슈퍼 키워드 사용법
super 키워드란? ― 부모 멤버 참조
super가 필요한 순간
- 자식 클래스와 부모 클래스에 동일한 이름의 필드·메서드가 있을 때 충돌을 피하기 위해 사용
- 객체가 생성된 인스턴스 메서드 안에서만 호출 가능 -
static영역에서는 사용 불가
class Parent {
int a = 10;
}
class Child extends Parent {
int a = 20; // 이름이 중복
void show() {
System.out.println(a); // 20
System.out.println(this.a); // 20
System.out.println(super.a); // 10
}
}
요약 💡
super.멤버 → 부모 클래스의 필드·메서드에 명시적으로 접근해 이름 충돌을 해결합니다.
super() 생성자 호출 ― 부모 초기화 보장
기본 규칙
- 생성자 첫 줄에만 작성 가능
- 작성하지 않아도 컴파일러가 자동으로 부모의 기본 생성자를 호출
- 부모에 매개변수 생성자만 있다면 직접 super(값) 으로 지정해야 컴파일 성공
class Parent {
int a;
Parent(int val) { a = val; } // 기본 생성자 없음
}
class Child extends Parent {
int b;
Child() {
super(10); // 필수! 부모 생성자 직접 호출
b = 20;
}
}
왜 필요할까?
자식 객체는 부모 필드도 함께 지니므로, 객체 생성 시 부모 생성자를 먼저 실행해 안정적인 초기화를 보장합니다.
super vs this 한눈에 비교
| 구분 | super | this |
|---|---|---|
| 참조 대상 | 부모 클래스 멤버 | 현재 클래스 멤버 |
| 사용 위치 | 자식 클래스 | 현재 클래스 |
| 생성자 호출 | super() → 부모 생성자 |
this() → 같은 클래스의 다른 생성자 |
| 사용 제한 | 인스턴스 메서드/생성자 | 인스턴스 메서드/생성자 |
실전 패턴 3가지
1. 이름 충돌 해결 패턴
class Person {
String name = "parent";
}
class Student extends Person {
String name = "child";
String getBoth() {
return name + "/" + super.name;
}
}
2. 공통 초기화 + 추가 로직
class Vehicle { Vehicle(int v){ … } }
class Car extends Vehicle {
Car(){ super(100); startEngine(); }
void startEngine(){ … }
}
3. 다형성 + 오버라이딩
class Animal { void sound(){ System.out.println("Sound"); } }
class Dog extends Animal {
@Override void sound(){ super.sound(); System.out.println("Bark"); }
}
질문 정리
Q1. super를 static 메서드에서 쓰면 왜 오류가 나나요?
A. static 영역은 인스턴스가 없으므로 부모 객체 참조(super) 개념이 성립하지 않습니다.
Q2. super()와 this()를 함께 쓸 수 있나요?
A. 둘 다 생성자 첫 줄에 있어야 하므로 동시에 사용 불가입니다.
Q3. 부모 필드가 private이면 super로 접근할 수 있나요?
A. 아니요. private 멤버는 상속은 되지만 접근 권한이 없으므로 Getter/Setter를 통해 간접 접근해야 합니다.
Q4. 부모 생성자 호출이 자동인데 직접 쓰는 이유는?
A. 부모에 매개변수 생성자만 있는 경우, 원하는 값을 넘겨 명시적 초기화를 해야 하기 때문입니다.
Q5. 인터페이스 default 메서드에서도 super 쓸 수 있나요?
A. 인터페이스명.super.defaultMethod() 형태로 충돌 해결 시에만 사용 가능합니다.
핵심 정리
super→ 부모 필드·메서드 직접 참조
super()→ 부모 생성자 호출 (생성자 첫 줄, 생략 시 기본 생성자 자동)올바른
super사용으로 상속 구조에서 이름 충돌과 안정적 초기화 문제를 손쉽게 해결하세요!
댓글남기기