일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ArrayList
- node.js
- 인터페이스
- throws
- 상속
- 코딩
- 코린이
- exception
- 변수
- 파이팅
- 바이트 단위 스트림
- 예외 처리
- 초보개발자
- 메서드
- FileInputStream
- try-catch
- MPA
- 보조 스트림
- 자바
- 인스턴스
- SSR
- 백엔드
- 문자 단위 스트림
- Java
- 자료형
- 새벽공부
- 개발자
- 다형성
- 배열
- 졸리다
- Today
- Total
SHUSTORY
08-6 다운 캐스팅과 instanceof 본문
하위 클래스로 형 변환, 다운 캐스팅
상위 클래스로 형 변환되었던 하위 클래스를 다시 원래 자료형으로 형 변환하는 것을 다운 캐스팅이라고 한다.
상위 클래스인 Animal 클래스와 하위 클래스인 Human / Tiger / Eagle 클래스가 있다.
여기서 Animal ani = new Human( ); 코드에서 생성된 인스턴스 Human은 Animal형이다.
인스턴스 Human은 Animal 클래스에서 선언한 메서드와 멤버 변수만 사용할 수 있다.
이럴 때 경우에 따라 다시 원래 인스턴스 자료형으로 되돌아가야 하는 경우가 있는데, 이럴 때 다운 캐스팅이 이루어진다.
instanceof
다운캐스팅을 하기 전 상위 클래스로 형 변환된 인스턴스의 원래 자료형을 확인해야 변환할 때 오류를 방지할 수 있는데,
이를 확인하는 예약어가 instanceof이다.
instanceof 예제 2행을 보면 이는 hAnimal의 원래 인스턴스형이 Human인지를 확인하는 것이다.
즉 왼쪽에 있는 변수의 원래 인스턴스형이 오른쪽 클래스 자료형인가를 확인한다.
반환 값이 true일 경우 다운 캐스팅을 하는데, 이때는 3행과 같이 명시적으로 자료형을 써 주어야 한다.
상위 클래스로는 묵시적으로 형 변환이 되지만, 하위 클래스로 형 변환을 할 때는 명시적으로 해야 하기 때문이다.
만약 instanceof로 인스턴스형을 확인하지 않으면 오류가 발생할 수 있다.
위 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 |