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
관리 메뉴

우주코딩

레퍼런스 형변환, 오버라이딩의 리턴타입, 오버라이딩과 메서드 호출, final 본문

자바 본 강의

레퍼런스 형변환, 오버라이딩의 리턴타입, 오버라이딩과 메서드 호출, final

우주코딩 2021. 7. 31. 11:13

레퍼런스 형변환

  • 레퍼런스를 형변환 하면 오버라이딩 하기 전, 해당 클래스의 인스턴스 변수를 만들 수 있다
    A4 extends A3{String a = 40; boolean w = true;}
    A3 extends A{int a = 30; String t = "A3";}
    A {String n = "A"; String t = "A"; boolean w =true;}
    

A4 obj1 = new A4();
System.out.println(((A3)obj1).a);
System.out.println(((A3)obj1).w); 없으면 수퍼 클래스의 필드를 가리킨다.


만약 형변환 클래스에 존재하지 않는 필드를 가리키면 오류가 난다.

```java
A4 obj1 = new A4();
System.out.println(((A)obj1).a); 컴파일 오류
  • 인스턴스 필드와 달리 메서드의 경우 레퍼런스에 대한 형변환에 상관 없이 실제 레퍼런스가 가리키는 클래스에서 메서드를 찾아 올라간다.

X <- X2 <- X3 <- X4
X.m1();
X.m2();

X2.m1(); overriding

X3.m2(); overriding

X4.m1(); overriding

X4 x4 = new X4();
x4.m1();

((X3)x4).m1(); X4의 m1
((X2)x4).m1(); X4의 m1
((X)x4).m1(); X4의 m1

오버라이딩의 리턴타입

  • 오버라이딩 메서드의 리턴 타입은 서브 클래스도 가능하다. 하지만 오버라이딩의 리턴 타입은 같아야한다.
  • 메서드를 오버라이딩 할 때 리턴 타입으로 수퍼클래스는 불가능하다.

오버라이딩과 메서드 호출

A (m())<- A2(m(),x()) <- A3(y())

A a = new A2();
A a2 = new A3();
a.m(); A2 클래스의 m
a.x(); 컴파일 불가

((A2)a).x(); 컴파일 가능 

a2.m(); A2의 m호출

레퍼런스가 하위 클래스의 인스턴스를 가리킬 때, 레퍼런스를 통해 호출하는 메서드는 레퍼런스가 실제 가리키는 하위 클래스에서 찾아 올라 간다.
오버라이딩 메서드 호출 규칙에 따라, 레퍼런스가 실제 가리키는 객체의 클래스부터 메서드를 찾아 올라간다.

final

  • final 클래스를 상속받을 수 없다
  • 메서드에 final을 붙이면 서브 클래스에서 오버라이딩 할 수 없다.
    서브클래스에서 변경하면 안되는 메서드는 final로 처리한다.
  • 필드에 final 붙인 상수 필드는 생성자에서 초기화시켜야한다.
  • 상수 필드는 보통 스태틱 필드로 만든다. 인스턴스마다 개별적으로 관리하지 않기 때문이다.
  • 파라미터는 메서드가 호출될 때 외부의 값을 받는 용도의 변수다. 메서드 안에서 파라미터 값을 임의로 변경하게 되면 처음 받은 파라미터 값을 사용하지 못하는 상황이 발생한다. 그래서 이런 상황을 피하고자, 보통 실무에서 파라미터를 final로 선언한다.
Comments