본문 바로가기
[Java]

업캐스팅 ,다운캐스팅 ,Instanceof

by ho-bolt 2021. 9. 3.

업 캐스팅이란!

부모타입으로 형변환 한 것을 의미한다. 

 

=> 부모 타입의 객체에 자식생성자를 호출

=> 부모 타입의 객체에 자식 클래스의 필드를 담아주는 것 

=> 업캐스팅 된 객체는 자식 클래스에서 추가된 내용을 사용할 수 없다

단!! 오버라이딩 된 메소드는 갖게 된다. 

부모 클래스 객체명 =new 자식 생성자();

 

그림으로 설명해보자면, 부모 클래스인 Car에는 on key, off key메소드가 있다. 자식 클래스인 superCar는 

오버라이딩된 on music, off music메소드가 있다고 가정하자. 만약 superCar 클래스의 생성자를 호출한다면 먼저

부모인 Car 클래스 먼저 생성하기 때문에 넓이는 Car 클래스로 만든다. 따라서 빨간색 네모크기만큼 사용할 수 있다. 

그래서 자식 클래스가 가지고 있는 다른 필드를 사용하진 못하지만 오버라이딩된 메소드는 자식의 내용으로 사용할 수 있다. 

 

위 그림판을 코드로 작성하고 아래처럼 사용한다면

시동끄면 노래같이 꺼짐
시동걸때 노래시작

이렇게 출력이 된다. 즉 오바라이딩된 메소드만 사용할 수 있는데 내용은 자식의 내용으로 사용되는 것이다. 이렇게 타입은 부모이지만 내용은 자식으로 채우는 것을 업캐스팅이라 한다. 

따라서 부모 타입으로 배열도 만드는 것이 가능하다. 1번째 있는 건 업캐스딩이 되어 있다고 할 수 있다. 

 

다운캐스팅

 

다운캐스팅이란 

=>업 캐스팅 된 객체를 다시 자식 객체에 담는 것을 말한다. 

=> 업 캐스팅 된 객체에 다시 자식 클래스의 필드를 달아주는 것

=> 업 캐스팅 시 잘려나간 자식 클래스의 내용을 사용하려면, 자식 클래스 타입으로 바꿔줘야한다. 

 

자식클래스 객체=(자식클래스)업캐스팅 객체;

 

위의 예를 보면 

 

이렇게 적어야 자식클래스의 필드를 사용할 수 있다. ()를 두번이나 사용한 이유는 형변환 연산자에서 .이 가장 빠른 최우선 우선연산자이기 때문에 먼저 묶어야지 사용할 수 있다. 

그러나 이렇게 사용하는 것은 불편하다! 따라서 

 

자식클래스 객체=(자식클래스)업캐스팅 객체;

이렇게 사용한다. 

 

Instanceof 

 

객체 instanceof  클래스명 : 객체가 뒤에오는 클래스의 타입인지 비교 
true /false 두가지 결과로 나오는 조건식

부모객체 instanceof부모클래스  :TRUE
자식객체 instanceof자식클래스 :TRUE
부모객체 instanceof자식클래스 :FALSE
자식객체 instanceof부모클래스 TRUE
업캐스팅객체 instanceof부모클래스 :TRUE
업캐스팅객체 instanceof자식클래스 :옵션이 없는 슈퍼카는 슈퍼카입니까?
:true

 

Instanceof는 이 객체가 업캐스팅된 객체만을 다운캐스팅하기 위해 사용한다. 

위와 같은 예제로 설명할 수 있다. Car를 상속받는 SuperCar가 있는데 Car타입의 배열 객체 garage에서 SuperCar 메소드를 이용하고 싶다면 if (garage[i] instanceof SuperCar) 이러한 조건식을 넣어주어야 한다. 그렇지 않으면 new Car("K7", "White", 6000),이 객체가 어떻게 SuperCar로 형변환하냐는 에러가 뜬다. 따라서 그것을 판별하기 위해 instanceof를 사용한다. 

728x90

댓글