super 키워드와 super() 메서드 요약
- 공통적으로 상속 관계를 전제로 한다.
- super. : 상위 클래스 객체 호출
- super() : 상위 클래스 생성자 호출
super 키워드
상위 클래스의 멤버를 가리키는 역할을 한다.
상위 클래스의 필드명과 하위 클래스의 필드명이 중복될 때 상위 클래스의 필드를 호출할 때 사용한다.
메서드 오버라이딩으로 가려진 상위 클래스의 필드 또는 메서드를 호출하기 위해 사용한다.
즉, super 키워드를 사용하면 상위 클래스의 멤버를 사용할 수 있다.
super 키워드 구조
// super. 키워드
super.상위 클래스의 멤버
super.필드
상위 클래스의 필드명과 하위 클래스의 필드명이 중복될 때 상위 클래스의 필드를 호출
// super.필드
class Upper {
int count = 20; // Upper.conut
}
class Lower extends Upper {
int count = 15; // Lower.count
void callNum() {
System.out.println("count = " + count); // count = 15
System.out.println("this.count = " + this.count); // this.count = 15
// 하위 클래스에서 상위 클래스의 count를 호출하는 방법(super.)
System.out.println("super.count = " + super.count); // super.count = 20
}
}
super.메서드()
메서드 오버라이딩으로 가려진 상위 클래스의 필드 또는 메서드를 호출
class Upper {
public void print() {
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
}
}
// super 키워드 사용 x
// 단지 6을 출력하는 코드 한 줄을 추가하는데 다시 1~5 출력문을 작성해야 해서 번거롭다.
class MyClass extends Upper {
@Override
public void print() {
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
System.out.println(6);
}
}
// super.메서드()
class Lower extends Upper {
@Override // 메서드 오버라이딩
public void print() {
super.print(); // Upper 클래스의 print()메서드 호출
System.out.println(6);
}
}
super() 메서드
- this() 메서드가 현재 클래스의 생성자를 호출하는 역할이라면 super()은 상위 클래스의 생성자를 호출하는 역할이다.
- this()와 마찬가지로 생성자 안에서만 사용 가능하고, 반드시 첫 줄에 위치해야 한다.
- 모든 생성자의 첫 줄에는 반드시 this() 또는 super()가 선언되어야 한다.
- super()가 없는 경우 컴파일러는 생성자의 첫 줄에 자동으로 super()를 추가한다.
-> 하위 클래스의 생성자를 이용해 인스턴스를 생성할 때 상위 클래스의 인스턴스가 먼저 생성되는 이유
public class Main {
public static void main(String[] args) {
A a = new A();
System.out.println("===구분선===");
B b = new B();
System.out.println("===구분선===");
C c = new C();
}
}
class A {
public A() {
System.out.println("A 생성자 호출");
}
}
class B extends A {
public B() {
// super() 컴파일러가 자동으로 추가
System.out.println("B 생성자 호출");
}
}
class C extends A {
public C() {
super();
System.out.println("C 생성자 호출");
}
}
super() 주의사항
- 하위 클래스 생성자 내부에 super()가 없는 경우 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입한다.
- super() 형태만 봐도 매개변수를 받지 않는 기본 생성자라는 것을 알 수 있다.
- 따라서 상위 클래스에 기본 생성자가 없으면 상위 클래스의 기본 생성자를 추가하려고 하는데 기본 생성자를 찾을 수 없어 다음과 같이 에러가 발생한다.
- 방지 : 상위 클래스에 기본 생성자를 따로 추가 또는 super(매개변수)의 형태로 super() 메서드를 따로 추가하는 방법이 있다.
'Langauge > Java-basic' 카테고리의 다른 글
[Java] 추상 클래스와 추상 메소드 (abstract 제어자) (0) | 2022.08.05 |
---|---|
[Java] 클래스의 정점, Object 클래스 (0) | 2022.08.04 |
[Java] 메서드 오버라이딩(Method Overriding) (0) | 2022.07.31 |
[Java] instanceof : 캐스팅 가능 여부 확인 (0) | 2022.07.30 |
[Java] 업 캐스팅과 다운 캐스팅 (0) | 2022.07.30 |