목차
1. super란?
2. 조상 클래스의 생성자로서 super
1. super란?
super 키워드는 부모 클래스로부터 상속받은 맴버나 메소드를 자식 클래스에서 참조할 때 사용하는 참조변수이다.
맴버변수와 지역변수를 구분하기 위해 this를 사용했듯이, 부모의 맴버와 자식의 맴버와 이름이 같을 때는 super를 사용해 구별할 수 있다. 코드 예제를 보면서 구분해보자
코드예제
public class InherentEx4 {
public static void main(String[] args) {
DriedRamen driedRamen = new DriedRamen();
driedRamen.print();
}
}
class Ramen {
int calorie = 540;
}
class DriedRamen extends Ramen {
int calorie = 340; // 건면은 칼로리 340
void print() {
System.out.println("this.calorie = " + this.calorie);
// this.calorie = 340
System.out.println("super.calorie = " + super.calorie);
// super.calorie = 540
}
}
건면은 라면을 상속하였다. 건면의 멤버변수는 340으로 초기화되었는데 각각 어떤것이 출력될까?
먼저 this를 통해 현재 객체의 맴버변수의 값 340을 출력하였다.
이후 super를 통해 부모의 맴버변수 540을 출력하였다.
한편 this와 마찬가지로 super는 인스턴스와 관련된 코드이다. 따라서 static 메서드에서는 사용할 수 없다.
2. 조상 클래스의 생성자로서 super
this()처럼 super()도 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는 데에 사용되지만, super()는 조상 클래스의 생성자를 호출하는 데에 사용된다.
자식 클래스의 인스턴스를 생성하면, 자식의 맴버와 더불어 부모의 맴버까지 모두 들어간 인스턴스가 생성되는 것이다. 그렇기 때문에 자식 인스턴스에서 부모의 맴버를 사용할 수 있는 것이다. 하지만 부모의 맴버를 사용하려면, 부모의 맴버가 사용전에 초기화 되어 있어야 할 것이다. 그래서 최고 조상인 Object 클래스를 제외하고는 모든 클래스의 생성자의 첫줄에 반드시 부모의 생성자를 호출하게 된다. 만약 프로그래머가 호출하지 않는다면, 컴파일러가 자동으로 super()를 생성한다.
아래의 코드를 보며 다시 이해해보자
코드예제
위의 에러는 왜 발생했을까?
앞서 자식 클래스의 인스턴스를 생성하면, 자식의 맴버와 더불어 부모의 맴버까지 모두 들어간 인스턴스가 생성된다고 했다.자식 instance를 생성해 부모의 맴버를 가질 수 있으려면, 부모의 맴버변수가 먼저 초기화 되어야 한다.
부모의 맴버인 x,y가 초기화되지도 않았는데 값을 미리 알고 자식생성자에서 x,y를 초기화할 수는 없기때문이다.
따라서 super를 추가해주어야 한다.
변경후 코드 예제
이제 전체코드를 보며 동작 순서를 이해해보자.
전체 코드
public class InherentEx5 {
public static void main(String[] args) {
Pointer3d pointer3d = new Pointer3d(1, 2, 3);
}
}
class Pointer {
int x,y;
// 부모 생성자
Pointer(int x, int y) {
//super(); -> 최고 조상인 Object 생성자 호출
this.x = x;
this.y = y;
}
}
class Pointer3d extends Pointer{
int z;
//자식 생성자
Pointer3d(int x, int y, int z) {
super(x,y); // 부모 클래스의 Pointer(int x, int y)를 호출한다.
this.x = x;
this.y = y;
this.z = z;
}
}
1. 자식 생성자를 호출하면 먼저 super(x,y);의 코드를 읽는다.
2. super(x,y);코드로 부모 생성자 Pointer(int x, int y)를 호출하게 된다.
3. 부모의 맴버가 초기화 된다.
4. 이후 자식의 맴버가 초기화 된다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 다형성(polymorphism) 이란? (0) | 2022.06.24 |
---|---|
[Java] 접근 제어자와 기타 제어자 (0) | 2022.06.24 |
[Java] 오버라이딩과 오버로딩 그리고 그 차이점 (0) | 2022.06.23 |
[Java] 클래스 상속과 포함관계 (0) | 2022.06.23 |
[Java] 변수의 초기화 (0) | 2022.06.23 |