우주코딩
접근 범위, 오버라이딩과 super 키워드 본문
접근 범위
private : 같은 클래스
(default) : 같은 클래스 + 같은 패키지
protected : 같은 클래스 + 같은 패키지 + 서브 클래스
public : 모두
접근 권한이 없는 메서드는 오버라이딩 할 수 없다.
오버라이딩 메서드의 접근 범위를 확대하는 것은 괜찮다. 접근 범위를 상위클래스의 접근 범위대로 지정하는 것 또한 가능하다. 하지만 상위클래스의 메서드의 접근 범위를 좁히는 오버라이딩은 불가능하다.
=> private 은 오버라이딩 자체가 불가능하기 때문에 접근범위를 확대할 수 없다.
오버라이딩과 super 키워드
A를 상속받은 A2의 클래스 안에서
A 클래스의 메서드를 오버라이딩 한 후 메서드를 호출할 때
this.m(); 을 호출하면 A2 클래스(해당 클래스)부터 해당 메서드를 찾으면서 (찾으면) 호출하는 것이고
super.m(); 을 호출하면 수퍼클래스인 A부터 메서드를 찾는다.
X <- X2 <- X3 <- X4
X.m1();
X.m2();
X2.m1(); overriding
X3.m2(); overriding
X4.m1(); overriding
X4 클래스에서 this.m1() = X4.m1();
super.m1() = X2.m1();
this.m2() = X3.m2();
super.m2() = X3.m2();
super.m1(); 을 호출할 때 X4클래스부터 차례대로 위로 올라가면서 m1 메서드를 찾는다.
가장 가까운 super 클래스의 m1이 X2에 있기 때문에 X2의 m1을 호출한다
this.m2(); 를 X4에서 호출할 때 X4 클래스부터 m2 메서드를 찾기 시작한다. 가장 가까운 m2가 X3 클래스에 있기 때문에 X3 클래스의 m2를 호출한다.
super.m2(); 를 X4에서 호출할 때 X3 클래스부터 m2 메서드를 찾기 시작한다. 가장 가까운 m2가 X3 클래스에 있기 때문에 X3 클래스의 m2를 호출한다.
그럼 this.m2(); 와 super.m2(); 의 클래스가 같은가? ㅇㅇ 같다!
%%% 주의 %%%%
super.super.m1();
obj.super.m1();
=> 이런 문법 없다.
super 키워드2
this.메서드() 호출?
=> 현재 클래스부터 호출할 메서드를 찾아 올라 간다.
super.메서드() 호출?
=> 부모 클래스부터 호출할 메서드를 찾아 올라 간다.
void test() {
this.m1(); // X5의 m1() : this가 실제 가리키는 인스턴스 클래스를 기준으로 메서드를 찾아 올라 간다.
super.m1(); // X2의 m1() : test()가 소속된 클래스를 기준으로 수퍼 클래스부터 메서드를 찾아 올라간다.
this.m2(); // X5의 m2()
super.m2(); // X3의 m2()
}
}
'자바 본 강의' 카테고리의 다른 글
캡슐화, 게터와 세터 (0) | 2021.07.31 |
---|---|
레퍼런스 형변환, 오버라이딩의 리턴타입, 오버라이딩과 메서드 호출, final (0) | 2021.07.31 |
다형성과 다형적 변수, 오버로딩과 상속, 오버라이딩과 필드 오버라이딩 (0) | 2021.07.30 |
상속과 생성자, 다중 상속, Specialization / Generalization , 추상 클래스, 추상화 문법, 추상 메서드 (0) | 2021.07.30 |
상속 클래스 로딩과 인스턴스 생성 과정, 생성자 호출 순서 (0) | 2021.07.28 |