1. 부모 생성자 호출 super()
1) super() 메서드는 부모 생성자를 호출하는 메서드.
2) 부모의 멤버는 부모의 생성자를 호출해서 초기화함.
3) 모든 객체들은 클래스의 생성자를 호출해야만 생성됨. 자식 객체를 생성할 때는 부모 객체부터 생성되고 자식 객체가 생성됨. 그렇다면 자식 객체를 만들었을 때 부모 객체의 생성자는 어떻게 호출할 수 있을까? super()를 사용하면 부모 객체의 생성자가 호출됨.
4) 자식 생성자 안에서 부모 생성자가 super() 로 인해 호출 되고, 자식 생성자가 나중에 호출 됨.
- 자식 클래스의 모든 생성자에는 super()가 생략되어 있음. 매개변수 입력시, 그에 맞는 부모클래스 생성자를 호출해야 하고, 매개변수 미입력 또는 super() 생략시, 부모 클래스 기본 생성자를 호출해야 함.
class Point { //부모 클래스
int x, y;
Point(int x, int y) { //부모 생성자
this.x = x;
this.y = y;
}
}
class Point3D extends Point { //자식 클래스
int z;
Point3D(int x, int y, int z) {
super (x, y); //부모 클래스의 생성자 Point(int x, int y)를 호출
this.z = z; //자신의 멤버를 초기화
}
}
5) 명시적으로 부모 생성자 호출
- 부모 객체를 생성할 때, 부모 생성자를 선택해서 호출할 수 있음.
- super(매개값,...) 은 매개값과 동일한 타입 개수, 순서가 맞는 부모 생성자를 호출함.
- 자바는 부모의 매개변수가 없는 기본 생성자를 찾는 것이 기본인데, 부모 클래스에 매개변수가 있는 생성자만 있는 경우 꼭 super()을 이용해 부모 생성자를 호출해야만 함.
- 자식 클래스의 생성자에서 super()을 명시적으로 지정해주지 않으면 컴파일시 super()이 추가됨.
- super()은 반드시 자식 클래스의 생성자에서 가장 첫 줄에 선언되어야 함.
자식클래스(매개변수선언, ...) {
super(매개값, ...);
...
}
2. 참조 변수 super
1) 객체 자신을 가리키는 참조 변수. 인스턴스 메서드(생성자) 내에만 존재, static 메서드 내에서는 사용 불가.
2) 조상의 멤버를 자신의 멤버와 구별할 때 사용.
3) 동일한 이름의 변수나 메서드가 부모 클래스와 자식 클래스에 둘 다 존재할 경우, 부모 클래스의 변수와 메서드는는 가려짐.
- 이 때 super 를 사용하면 자식 클래스에서 수정되기 전의 부모 메서드를 호출할 수 있음.
ex) super.부모메서드();
ex) super.부모변수();
public static void main(String args[]) {
Child c = new Child();
c.method();
}
class Parent {int x = 10;}
class Child extends Parent {
int x = 20; //부모 클래스의 int x 와 자식 클래스의 int x 는 구분되어야 함.
void method() {
System.out.println("x=" + x); //가장 가까운 값인 20이 출력됨.
System.out.println("this.x=" + this.x); //자식 클래스 멤버를 가리키는 this.x=20 출력
System.out.println("super.x=" + super.x); //부모 클래스 멤버를 가리키는 super.x=10 출력
}
}
참고 : [한빛미디어] 이것이 자바다 (신용권의 Java 프로그래밍 정복) Chapter 7.상속
참고 : [도우출판] JAVA의 정석(3ND EDITION)-자바의 정석 최신 Java 8.0 포함 Chapter 7.상속
'JAVA' 카테고리의 다른 글
컬렉션 프레임워크 (0) | 2022.08.28 |
---|---|
람다식 (Lambda Expression) (0) | 2022.08.28 |
상속과 포함 (0) | 2022.08.28 |
static 멤버 & 인스턴스 멤버 (0) | 2022.08.28 |
접근 제어자와 캡슐화 (0) | 2022.08.28 |
댓글