전에 상위 클래스로 변환하는 것을 업 캐스팅이라고 했습니다.

이 업 캐스팅된 클래스를 다시 원래의 타입으로 형 변환하는 것을 다운 캐스팅이라고 합니다. 이 다운 캐스팅은 하위 클래스로 형 변환하기 위해 명시적으로 해야합니다.

예를 들면, 다음과 같이 작성할 수 있습니다.

SuperClass superObj = new SubClass(); // 묵시적
SubClass subObj = (SubClass) superObj; // 명시적

하지만 다운 캐스팅을 해줄 때, 문제가 발생할 수 있습니다. SuperClass를 상속받은 Sub1Class와 Sub2Class가 있다는 가정 하에 아래와 같은 코드는 문제가 발생합니다.

SuperClass obj1 = new Sub2Class();

Sub1Class obj2 = (Sub1Class) obj1;

위의 코드와 같은 경우, 컴파일 에러는 나지 않지만 실행시키면 에러가 발생하게 됩니다. 다운 캐스팅을 할때 명시적으로 형 변환해주는 타입과 변수의 타입이 같은지만 비교하기 때문에 컴파일 에러는 나지 않고 실행 중에 Sub2Class에서 Sub1Class로 형 변환을 할 수 없다는 에러가 발생합니다.

이런 에러가 발생하지 않기 위해 instanceof 지정어를 사용하여 확인해야 합니다.

instanceof는 원래 인스턴스의 형이 맞는지 여부를 체크하는 지정어로 맞으면 true 아니면 false를 반환 합니다.

if(obj1 instanceof Sub1Class)
	Sub1Class obj2 = (Sub1Class) obj1;

위와 같이 instanceof 지정어를 사용하여 인스턴스 형이 맞는지 여부를 확인하게 되면, 실행시켰을 때 인스턴스 형이 같지 않더라도 에러가 발생하지 않습니다.

왜냐하면, obj1은 Sub1Class 형이 아니였기 때문에 위의 if 문을 실행하지 않고 넘어가기 때문입니다.

이 instanceof를 사용함으로써 에러가 발생하지 않는 훨씬 더 안정적이게 코드를 작성할 수 있습니다.

이상으로 자바에서 사용하는 다운 캐스팅과 instanceof를 간단하게 알아봤습니다.

profile
꾸준함으로 성장하는 개발자 지망생

0개의 댓글