Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

우주코딩

접근 범위, 오버라이딩과 super 키워드 본문

자바 본 강의

접근 범위, 오버라이딩과 super 키워드

우주코딩 2021. 7. 31. 10:58

접근 범위

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()
    }
  }
Comments