▶ [다형성1] 상속과 메모리 구조
https://zoooom-in.tistory.com/61
[김영한_자바기본][10. 다형성1] 상속과 메모리 구조(p.1-23)
1. 자식 객체를 부모 참조 변수에 할당하면 부모 메서드에 접근이 가능하다. 2. 다운캐스팅은 '일시적으로' 부모 타입의 참조 변수를 자식 타입으로 형변환하는 것이다. 3. 다운 캐스팅 수행 전 ins
zoooom-in.tistory.com
자식 타입의 기능을 사용하려면 다운 캐스팅 결과를 변수에 담아두고, 이후 사용하면 된다.
`자식` 변수를 통해 `부모` 객체를 참조할 때에 `자식` 타입으로 형변환된 객체를 사용할 수 있다.
다만 참조하는 의미를 담은 코드를 실행해도 구현된다.
즉 다운캐스팅으로 변수 타입 자체를 변경하는 것이 아니라
변수가 참조하는 객체 타입을 다운시켜 바꾸는 것이다.
변수에 담아 다운 캐스팅하는 경우 | 일시적 다운 캐스팅하는 경우 |
- 코드가 명확해지고 가독성이 향상된다. - 다운캐스팅된 객체를 재사용해야 하는 경우에도 편리하다. |
- 코드를 간결하게 유지할 수 있다. |
[p.7 / CastingMain1] 다운 캐스팅 이해하기
public class CastingMain1 {
public static void main(String[] args) {
Parent poly = new Child();
Child child = (Child) poly;
child.childMethod();
poly.parentMethod();
}
}
- `(Child) poly`는 다운캐스팅을 수행하여 `poly`가 실제로 참조하는 객체를 `Child` 클래스의 객체로 캐스팅한다.
- 따라서 `poly` 변수는 `Child` 클래스의 메서드와 속성에 접근할 수 있다.
[p.7 / CastingMain1_Child 발췌] 다운캐스팅 된 poly는 일시적으로 Child type을 가진다.
Child child = (Child) poly;
- `child.childMethod()`를 호출하면 `Child` 클래스에서 정의된 메서드가 실행된다.
- 이는 `poly`가 실제로 참조하는 객체가 `Child` 클래스의 객체이기 때문에 가능하다.
- 일시적으로 `Child` 타입으로 형변환된 결과를 가리키는 것이지, `poly` 객체 자체의 타입이 변경되는 것은 아니다.
- 따라서 `child` 변수를 통해 `poly` 객체를 참조할 때에만 `Child` 타입으로 형변환된 객체를 사용할 수 있다.
- 다른 부분에서 `poly` 객체에 접근할 때에는 여전히 원래의 타입을 유지하게 된다.
[p.7 / CastingMain1_poly] poly는 여전히 Parent type을 가진다.
poly.parentMethod();
- `poly.parentMethod()`를 호출하면 `Parent` 클래스에서 정의된 메서드가 실행된다.
- 이것은 다운캐스팅 후에도 `poly`가 여전히 `Parent` 클래스의 객체를 참조하고 있기 때문에 가능하다.
- 따라서 `child.childMethod()`를 호출하더라도 `poly`에는 영향이 없으며, `poly.parentMethod()`를 호출하여도
`poly`는 여전히 원래 객체를 참조하므로 영향을 받지 않는다.
*다운 캐스팅 도식화 : 일시적 참조값이 자식의 내용에 접근한다.
(기존)
(다운캐스팅)
[p.10 / CastingMain2] 일시적 다운 캐스팅
public class CastingMain2 {
public static void main(String[] args) {
Parent poly = new Child();
((Child)poly).childMethod();
}
}
- poly 덩어리를 묶어준다.
> 묶지 않으면 단순 poly.childMethod();로 인식하기 때문에 해당 부분에 주의해야 한다.
'Java > [inflearn] 자바 기본' 카테고리의 다른 글
[김영한_자바기본][12. 다형성과 설계] (보충) 예제를 통한 이해 (p.13- (0) | 2024.02.19 |
---|---|
[김영한_자바기본][8.final] finl 변수와 참조 (p.7-8) (2) | 2024.02.16 |
[김영한_자바기본][6. 접근 제어자] (보충) 접근 제어자 - 클래스 / 클래스 내부 동일한 클래스 객체 생성(p.10-11) (0) | 2024.02.15 |
[김영한_자바기본][3. 객체 지향 프로그래밍] (보충) 객체 지향 메서드 이해 (p.8-9, p.12) (0) | 2024.02.15 |
[김영한_자바기본][2. 기본형과 참조형] (보충) 메서드에 객체 전달 / 메서드에서 객체 반환 / NullPointerException (p.16-20, p.26-29) (0) | 2024.02.15 |