강의로 돌아가기
김동현

클래스 형변환(Car car=new Bus();)

클래스 형 변환시 Parent를 부모 클래스, Child 를 자식클래스라고 하였을 때

Child extends Parent

Parent의 인스턴스를 Child가 상속하여 사용하면

Child의 정보가 더 많은것처럼 생각됩니다. 그런데,

기본자료형에서의 형변환은 long->int로 갈 때 값이 바뀔 경우를 대비하여 형변환을 명시적으로 해주는데 비해

클래스에서의 형변환은 왜 Child child=(Child) Parent; 로 갖고있는 정보가 더 적은 Parent에서 이가 확장된 Child로 초기화시켜줄 때

명시적으로 형변환을 해주어야 하는지 이해가 가지 않습니다

아래 코드를 예시로 들 때,

public class Parent{
public Parent(){
int a=0;}}

public class Child extends Parent{
public Child(){
int b=0;}}
////////////////////
Parent parent=new Child();// 이 경우 parent객체는 int b와 int a의 정보를 모두 갖고 있는 것인가요?

제가 어디서 잘 못 이해한 부분이 많은 것 같은데 그 중에서
Car car=new Bus(); 구절을 확실하게 이해하지 못해서 여쭤봅니다.
Car car=new Bus();시
Car()생성자로 car객체가 생성되고 Bus() 생성자로 bus 객체가 생성된 후 car 객체에 bus 객체의 인스턴스들이 car객체로 초기화되는 것인가요?

Car 형태지만 실제로는 Bus라는 의미가
잘 이해가 가지 않습니다.

1 개의 답변
정두식

'문제가 발생할 수 있는 경우에 명시적으로 처리하도록 한다'라는 관점으로 보면 일관성이 있습니다.

long에 해당하는 값을 int에 넣으려고 하면 안 들어갈 가능성이 있기 때문에 명시적으로 처리하라고 하는 겁니다.

Car car = new Bus()라고 car를 생성한 다음에 car의 어떤 기능을 호출하더라도 정상적으로 동작할겁니다. Bus는 Car의 기능을 모두 구현하니까요.
하지만 Bus에는 Car가 가지고 있지 않은 추가 기능(영상에서 ppangppang메소드)이 구현될 수 있습니다.
Bus에 car를 넣고 pangpang을 호출하면 없는 매소드를 호출하기 때문에 Exception이 발생하는데요. 이런 '문제가 발생할수 있다'는 것을 개발자가 인지하고 있으니까 그냥 그렇게 하게 해 달라는 의미로 명시적인 type casting을 해야 하는 겁니다.

  • 김동현
    덕분에 정리되었습니다. 설명 감사드립니다. 김동현 2018.08.05 23:40
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.