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 |