Java/[inflearn] 자바 기본

[김영한_자바기본][10. 다형성1] (보충) 다형성과 캐스팅 / 일시적 다운 캐스팅 (p.7-10)

줌인. 2024. 2. 16. 17:06

▶ [다형성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();로 인식하기 때문에 해당 부분에 주의해야 한다.

728x90