super 키워드
부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수이다.
인스턴스 변수의 이름과 지역 변수의 이름이 같을 경우 인스턴스 변수 앞에 this 키워드를 사용하여 구분하는 것 처럼
부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별할 수 있다.
class Parent {
int a = 10;
}
class Child extends Parent {
int a = 20;
void display() {
System.out.println(a);
System.out.println(this.a);
System.out.println(super.a);
}
}
public class SuperTest {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
Output
20
10
10
이렇게 자바에서는 super 참조 변수를 사용하여 부모 클래스의 멤버에 접근할 수 있다. this와 마찬가지로 super 참조 변수를 사용할 수 있는 대상도 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없다.
super() 메소드
부모 클래스의 생성자를 호출할 때 사용된다.
자식 클래스의 인스턴스를 생성하면, 해당 인스턴스에는 자식 클래스의 고유 멤버뿐만 아니라 부모 클래스의 모든 멤버까지도 포함되어 있다. 따라서 부모 클래스의 멤버를 초기화하기 위해서는 자식 클래스의 생성자에서 부모 클래스의 생성자까지 호출해야만 한다. 이러한 부모 클래스의 생성자 호출은 모든 클래스의 부모 클래스인 Object 클래스의 생성자까지 계속 거슬러 올라가며 수행하게 된다.
따라서 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않는 모든 자식 클래스의 생성자 첫 줄에 자동으로 super(); 명령문을 추가하여, 부모 클래스의 멤버를 초기화할 수 있도록 해준다.
자바 컴파일러는 컴파일 시 클래스에 생성자가 하나도 정의되어 있지 않아야만, 자동으로 기본 생성자를 추가해 줌으로 매개변수를 가지는 생성자를 선언해야 할 경우에는 기본 생성자까지 명시적으로 선언하는 것이 좋다.
class Parent11 {
int a;
Parent11() { //기본 생성자
a = 10;
}
Parent11(int n) { //매게변수를 가지는 생성자
a = n;
}
}
class Child11 extends Parent11 {
int b;
Child11() {
// super(40); //Parent11(int n) 을 받아 오게 되는것 주석 해제하고 실행하면 값이 40이 나옴
b = 20;
}
void display() {
System.out.println(a);
System.out.println(b);
}
}
public class SuperTest2 {
public static void main(String[] args) {
Child11 ch = new Child11();
ch.display();
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 객체지향 - 다형성 (polymorphism) (0) | 2023.03.01 |
---|---|
[JAVA] 객체지향 - 메소드 오버라이딩 (method overriding) (0) | 2023.03.01 |
[JAVA] 객체지향 - 상속 (inheritance) (0) | 2023.03.01 |
[JAVA] 객체지향 - 문자열 비교 (0) | 2023.03.01 |
[JAVA] 객체지향 - 싱글톤(Singleton) 패턴 (0) | 2023.03.01 |