Java/공부

0. UpDownCasting / instanceof

pakms980319 2024. 3. 11. 10:57

UpDownCasting

 

1. Upcasting

  • 하위 클래스 객체가 상위 클래스로 형변환되는 것이다
  • 상위 클래스형의 참조변수 = 하위 클래스의 객체
  • 상위 클래스형의 참조 변수를 통해서 상위 클래스의 속성에만 접근 가능
  • 하위 클래스에서 재정의한 메서드에 접근이 가능하다

 

1) 사용 실습

  • 부모 클래스형의 참조 변수 s1이 자식 클래스의 객체(Sub)를 가졌다
  • 자동 형변환이 된다
  • s1 변수는 자식 클래스의 속성에 접근하지 못한다
  • 메서드를 호출할 때는 자식 클래스에서 Overriding 된 메서드가 호출된다

 

Upcasting 그대로 사용하면 Sub Class의 멤버에 접근을 못하므로 DownCasting을 이용한다


2) 사용 실습 - Overriding

  • Upcasting이 된 상태에서 하위 클래스의 멤버에 접근하지 못한다
  • 하지만, Overriding된 하위 클래스의 메서드에는 접근이 가능하다

2. Downcasting

  • UpCasting 된 참조 변수를 Sub Class로 형변환 하는 작업이다
  • 위 작업을 수행하여 Sub Class의 멤버에 접근할 수 있게된다
  • 강제(명시적) 형변환이 필요하다
  • Upcasting이 되지않은 참조 변수를 DownCasting하면 컴파일 에러가 발생한다 (상위 클래스의 인스턴스는 자식 클래스의 공간이 정의되어있지 않기 때문이다)

1) 사용 실습

 

  • Upcastring 된 s1 참조 변수를 Downcasting하여 참조 변수 s2에 저장하면 Sub class의 속성에도 접근 가능해진다
  • DownCasting은 강제(명시적) 형변환이 필요하다

2) 에러 상황

Exception in thread "main" java.lang.ClassCastException: class Ch11.Super cannot be cast to class Ch11.Sub (Ch11.Super and Ch11.Sub are in unnamed module of loader 'app')

at Ch11.C04UpDownCastingMain.main(C04UpDownCastingMain.java:35)

  • Upcasting이 되지않은 변수를 Downcasting하면 컴파일 에러가 발생한다 (상위 클래스의 인스턴스로 자식 클래스의 공간이 정의 되지 않았기 때문이다)

 

해결법

  • 위 코드처럼 `new Sub()` 서브 클래스 객체를 (Super) 수퍼 클래스로 UpCasting이 된 상태에서 (Sub) 서브 클래스로 Downcasting이 가능하다.

3) 사용 실습 (2)

 

  • 위 UpDownTestFunc 메서드에서 B 객체인 ob2가 A 객체로 UpCasting 되면서 인자로 전달되었다
  • UpCasting된 객체 obj는 다시 객체 down에 DownCasting되어 저장되고 필드 b의 값을 변동하였다.
  • 이 때, 원본 객체 ob2의 필드 b의 값도 변경이 된다.

실행 결과


3. instanceof

  • instanceof는 객체 타입을 확인하는 연산자이다
  • 형변환 가능 여부를 확인하며 true / false로 결과를 반환한다
  • 주로 상속 관계에서 부모 객체인지 자식 객체인지 확인하는 데 사용된다

 

1) 사용 실습

 

  • A 클래스
  • A 클래스를 상속받은 B, C 클래스
  • A 클래스를 상속받은 B 클래스를 상속받은 D, E 클래스
  • A 클래스를 상속받은 C 클래스를 상속받은 F, G 클래스

 

위 메서드는 해당 형태로 형 변환이 가능하다면 식을 수행하도록 메서드를 작성하였다

 

main 메서드에서 위 처럼 호출을 한다면

클래스 True
A instanceof A
B instanceof A, instanceof B
C instanceof A, instanceof C
D instanceof A, instanceof B, instanceof D
E instanceof A, instanceof B, instanceof E
F instanceof A, instanceof C, instanceof F
G instanceof A, instanceof C, instanceof G

 

각 클래스는 위 조건을 만족하게 된다.

 

실행 결과


출처

 

https://mine-it-record.tistory.com/120

 

[JAVA] 자바_instanceof (객체타입 확인)

- 객체 타입 확인 instanceof - instanceof - instanceof는 객체 타입을 확인하는 연산자이다. - 형변환 가능 여부를 확인하며 true / false로 결과를 반환한다. - 주로 상속 관계에서 부모객체인지 자식 객체인

mine-it-record.tistory.com

 

'Java > 공부' 카테고리의 다른 글

0. hashCode()  (0) 2024.03.13
0. Abstract  (0) 2024.03.11
11. 참조형 (Reference type)  (1) 2024.03.05
10. Static  (0) 2024.03.05
9. 메서드  (0) 2024.03.05