SHUSTORY

08-6 다운 캐스팅과 instanceof 본문

프로그래밍/JAVA

08-6 다운 캐스팅과 instanceof

어서오시우 2023. 3. 2. 13:26
728x90

하위 클래스로 형 변환, 다운 캐스팅

상위 클래스로 형 변환되었던 하위 클래스를 다시 원래 자료형으로 형 변환하는 것을 다운 캐스팅이라고 한다.

 

상위 클래스인 Animal 클래스와 하위 클래스인 Human / Tiger / Eagle 클래스가 있다.

여기서 Animal ani = new Human( ); 코드에서 생성된 인스턴스 Human은 Animal형이다.

인스턴스 Human은 Animal 클래스에서 선언한 메서드와 멤버 변수만 사용할 수 있다.

이럴 때 경우에 따라 다시 원래 인스턴스 자료형으로 되돌아가야 하는 경우가 있는데, 이럴 때 다운 캐스팅이 이루어진다.

 

 

instanceof

다운캐스팅을 하기 전 상위 클래스로 형 변환된 인스턴스의 원래 자료형을 확인해야 변환할 때 오류를 방지할 수 있는데,

이를 확인하는 예약어가 instanceof이다.

instanceof 예제

instanceof 예제 2행을 보면 이는 hAnimal의 원래 인스턴스형이 Human인지를 확인하는 것이다.

즉 왼쪽에 있는 변수의 원래 인스턴스형이 오른쪽 클래스 자료형인가를 확인한다.

반환 값이 true일 경우 다운 캐스팅을 하는데, 이때는 3행과 같이 명시적으로 자료형을 써 주어야 한다.

상위 클래스로는 묵시적으로 형 변환이 되지만, 하위 클래스로 형 변환을 할 때는 명시적으로 해야 하기 때문이다.

만약 instanceof로 인스턴스형을 확인하지 않으면 오류가 발생할 수 있다.

 

Ex

위 Ex예제에서는 원래 자료형이 Human이 아닌 ani를 Human으로 다운캐스팅 했음에도 오류가 발생하지 않는다.

그 이유는 일단 Tiger 인스턴스가 Animal 형으로 자동 형 변환 되고, 변수 h의 자료형 Human과 강제 형 변환되는 ani의 (Human)형이 동일하기 때문에 컴파일 시 오류가 발생하지 않는 것이다. 하지만 코드 실행 시 오류가 발생한다.

 

Instanceof로 원래 인스턴스형 확인 후 다운 캐스팅하기

최종예제

  • 각 동물 인스턴스를 생성하여 Animal형으로 선언한 배열에 추가함으로 배열에 추가되는 요소의 자료형은 모두 Animal형으로 변환된다. 이때 호출 가능한 메서드는 Animal 클래스에 선언된 메서드 뿐이다.
  • 47-48 행에서 향상된 for문을 통해 모든 배열 요소를 하나씩 꺼내 move( ) 메서드가 호출되면 재정의된 메서드가 호출된다.하지만 배열 요소가 Animal이므로 readBook( ) 등등의 메서드는 사용 불가능하다. 즉, 자료형이 Animal형인 상태에서는 Human 클래스가 제공하는 readBook( ) 메서드를 호출할 수 없는 것이다. 만약 이를 호출하려면 원래 자료형으로 다운 캐스팅되어야 한다.
  • instanceof를 활용하여 실제 인스턴스형을 살펴본 후에 다운 캐스팅 하면 각 클래스의 메서드를 호출할 수 있다.

'프로그래밍 > JAVA' 카테고리의 다른 글

09-2 템플릿 메서드  (0) 2023.03.02
09-1 추상 클래스  (0) 2023.03.02
08-5 다형성 활용하기  (0) 2023.02.25
08-4 다형성  (1) 2023.02.25
08-3 메서드 오버라이딩  (0) 2023.02.25