목차
1. super
2. 자식클래스의 생성자
super 키워드
인스턴스를 가리키는 this 키워드와 비슷하게 부모 클래스를 가리키는 super라는 키워드도 있다.
super
· 부모 클래스에 대한 레퍼런스
· 자식 클래스에서만 사용 -> 부모 클래스의 멤버 호출
=> 자식 클래스에서 super를 이용해 접근 권한이 부여된 부모 클래스의 변수와 메소드에 접근 가능
class Cal{
public int sum(int n, int m) {
return n+m;
}
//overloading
public int sum(int n, int m, int o) {
return this.sum(n, m)+o;
}
}
class Cal3 extends Cal{
//overriding
public int sum(int n, int m) {
System.out.println("Cal3!!");
return super.sum(n, m);
}
public int sub(int n, int m) {
return n-m;
}
}
· Cal3에서 Cal의 변수와 메소드에 접근하기 위해서 super 이용
-> 오버라이딩하는 메소드에서 기존의 작업 앞 뒤로 손쉽게 추가적인 작업을 더 넣을 수 있다.
자식 클래스의 생성자
부모 클래스에 생성자가 있는 경우에 자식 클래스의 생성자는 무엇을 호출할까?
자식 클래스에서 부모 클래스 생성자 선택
· 원칙: 자식 클래스 생성자에서 부모 클래스 생성자를 명시적으로 선택
1. 명시적으로 부모 클래스 생성자 선택X
· 자식 클래스 생성자에 상관없이 컴파일러가 자동으로 부모 클래스의 기본 생성자 호출
2. 명시적으로 부모 클래스 생성자 선택
· 자식 클래스 생성자에서 super()를 이용
상속관계에 있는 클래스에 인자를 받는 생성자를 사용하는 경우 주의가 필요하다.
class Cal {
int n, m;
Cal(int n, int m){
this.n=n;
this.m=m;
}
...
}
※ 부모 클래스에 인자를 받는 생성자만 있는 경우
· 자식 클래스에서 생성자를 호출하는 경우(인스턴스 생성) 정의한 생성자가 없으면 부모 클래스의 기본 생성자를 호출
· 부모 클래스에 명시적으로 인자를 받는 생성자만 있는 경우
-> 자식 클래스에서 생성자를 명시적으로 만들지 않으면 컴파일 불가
=> 부모 클래스에 인자를 받는 생성자만 있는 경우, 자식 클래스에도 인자를 받는 생성자가 필요하다.
class Cal{
int n, m;
Cal(int n, int m){
this.n=n;
this.m=m;
System.out.println("Ca1!!");
}
public int sum() {
return this.n+this.m;
}
}
class Cal3 extends Cal{
Cal3(int n, int m) {
super(n, m);
System.out.println("Cal3!!");
}
public int sub() {
return this.n-this.m;
}
}
public class InheritanceApp {
public static void main(String[] args) {
Cal3 c3=new Cal3(2, 1);
}
}
실행결과
자식 클래스의 생성자 호출 및 실행
· 자식 클래스의 객체가 생성될 때 부모 클래스 생성자와 자식 클래스 생성자 모두 실행
· 호출 순서: 자식 클래스 생성자 -> 부모 클래스 생성자
· 실행 순서: 부모 클래스 생성자 -> 자식 클래스 생성자
· 컴파일러는 new 문장이 실행되면 Cal3의 생성자를 호출
· Cal3의 생성자는 자신의 코드를 실행하기 전, 먼저 부모 클래스인 Cal의 생성자를 호출
· Cal의 생성자 코드가 실행되고, 리턴하여 Cal3의 생성자 코드가 실행된 후 main 메소드로 돌아온다.
super()
· 부모 클래스의 생성자를 호출하는 코드
· 자식 클래스의 생성자에서 super()를 이용해 명시적으로 부모 클래스의 생성자를 선택
· super(parameter)
- 인자를 이용해 부모 클래스의 생성자 호출
- 반드시 생성자의 첫 라인에 입력
this, this(), super, super()
· this와 super는 레퍼런스
- this: 현재 객체의 모든 멤버를 접근 가능
- super: 현재 객체 내에 있는 부모 클래스 멤버를 접근 가능
· this()와 super()는 메소드 호출
- this(): 생성자에서 다른 생성자를 호출할 때 사용
- super(): 자식 클래스의 생성자에서 부모 클래스 생성자를 호출할 때 사용
'Programming 기초 > Java' 카테고리의 다른 글
[Java] 예외 클래스 (0) | 2023.05.04 |
---|---|
[Java] 예외 (0) | 2023.04.23 |
[Java] overloading vs overriding (0) | 2023.04.17 |
[Java] 상속 (0) | 2023.04.14 |
[Java] 생성자와 this (0) | 2023.04.11 |
댓글