기본형 변수와 같이 참조변수도 형변환이 가능하다. 단,서로 상속관계에 있는 클래스 사이에서만 가능하다. 자손타입과 조상타입간에 서로 참조변수로의 형변환만 가능하다. 이는 바로 윗 조상이 아닌 최상위 조상인 Object클래스와도 형변환이 가능하다.
업 캐스팅과 다운캐스팅
업 캐스팅 자손 클래스 -> 조상 클래스 : 형변환 생략가능 예시)
다운캐스팅 조상 클래스 -> 자손 클래스 : 형변환 생략불가능
예시를 보면서 이해해보자.
사진에서처럼 조상 클래스1개와 자손 클래스 2개가 있다. 조상클래스와 자손클래스의 형변환이 어떻게 이뤄지는지, 어떤 상황에서 에러가 발생하는지 알아보자.
참고로 자손클래스간의 관계는 전혀 발생하지 않는다.
Keybaord - Neonkeyboard // Keyboard - Neonkeyboard이처럼 두 가지의 상하 관계만 존재한다.
[업캐스팅 특징]
1. 형변환의 생략이 가능하다.
참조변수 k 에 N2라는 네온키보드 객체의 주소값을 넣으려고 한다.
둘 사이에는 형태가 같아야 하기 떄문에 사실상 (Keyboard)N2이다.
하지만 N2가 더 큰 범위(조상 멤버를 포함한 더 많은 변수)를 갖고 있기 때문에 형변환 생략이 가능하다.
간단한 정수를 예를 들어보자.
byte는 8비트로 표현이 가능하며 양의 범위로는 2^7-1(127)까지의 표현이 가능하다.
short는 16비트로 2^15-1(32,767)까지 표현이 가능하다.
byte범위의 a를 더 넓은 범위를 가진 short b에 집어넣으면 당연히 에러가 없이 잘 대입된다.
이때 (short)a로 꼭 형변환하지 않아도 당연히 b의 범주에는 a가 포함되기 때문에형변환을 생략할 수 있다.
이와 같은 원리라고 생각하면 된다.
[다운캐스팅]
네온사인의 참조변수 N에 k를 형변환하여 대입할때에는 생략을 할 수 없다.
업캐스팅의 반대 원리라고 생각하면된다.
k가 갖고 있는 멤버보다 Neon키보드가 갖고있는 변수가 더 많기 때문에 k가 사용할 수 있는 멤버변수가 늘어나는 것이며 이때 k는 실제 멤버 개수보다 사용할 수 있는 멤버의 개수가 많아지므로 문제가 발생할 수 있다.
2. k는 N2의 메서드를 사용할 수 없다.
k는 N2의 인스턴스를 참조할수 있어 Neonkeyboard인스턴스를 사용할 수 있지만, 실질적으로 k가 갖고있는 멤버변수에는 N2의 멤버변수가 없기 때문에 NeonSwitch();를 사용할 수 없다.
k가 Neonkeyboard에서 사용할 수 있는 메서드는 k가 갖고있는 변수를 사용한 메서드 뿐이다.
형변환은 차몾변수의 타입을 변환하는 것이며 인스턴스를 변환하는 것이 아니다. 따라서 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다. 단지 참조변수의 형본환을 통해 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위를 조절하는 것이다.
이번에는 Keyboard k =null; 이아닌 Keyboard k = new Keyboard();로 객체를 생성한 후에 형변환을 시도해보자.
보는 바와 같이 32번 줄에 오류가 발생한다. 이유가 뭘까? K의 인스턴스가 Keyboard이기 때문이다. 참조변수N 은 K의 자손 클래스이기때문에 K를 포함한 더 많은 변수와 클래스를 갖고 있다. 그래서 조상타임의 인스턴스를 자손타입의 참조변수로 참조하는 것이 허용되지 않는다.
다시한번 정리하자면!
1. 상속관계에 있는 타입간의 형변환은 자유롭게 가능하다. 2. 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다. 3. 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요하다.