안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
Animal 부모 클래스
public class Animal {
public void say() {
System.out.println("안녕하세요, 동물 입니다.");
}
}
Lion 자식 클래스
public class Lion extends Animal {
public void punch() {
System.out.println("라이언 펀치!");
}
}
Tiger 자식 클래스
public class Tiger extends Animal {
public void kick() {
System.out.println("타이거 킥!");
}
}
메인 메소드
public void test2() {
Animal[] arr = new Animal[2];
arr[0] = new Lion();
arr[1] = new Tiger();
arr[0].say();
((Lion)arr[0]).punch();
arr[1].say();
((Tiger)arr[1]).kick();
}
@콘솔출력값
안녕하세요, 동물 입니다.
라이언 펀치!
안녕하세요, 동물 입니다.
타이거 킥!
Animal 타입의 배열을 선언하여 각 인덱스에 Lion 객체, Tiger 객체를 요소로 입력하였습니다.
Animal 타입이기 때문에 각 자식 클래스의 메소드를 실행하기 위하여 다운 캐스팅을 수행하였습니다.
만약 for문을 이용하여 메소드를 출력하고 싶을 땐 어떻게 해야할까요?
public void test2() {
Animal[] arr = new Animal[4];
arr[0] = new Lion();
arr[1] = new Tiger();
arr[2] = new Lion();
arr[3] = new Tiger();
for(int i = 0; i < arr.length; i++) {
arr[i].say();
}
}
부모 클래스의 say()는 출력할 수 있겠지만, 각 자식 클래스의 punch()와 kick()메소드를 호출하기 위해선 반드시 다운 캐스팅이 필요한데요..
그렇다고 for문 내에서 다운캐스팅을 하면 Tiger 객체를 Lion 타입으로 캐스팅하려고 하니 ClassCastException이 발생하겠죠.
for(int i = 0; i < arr.length; i++) {
((Lion)arr[i]).punch(); //오류발생
}
실제 객체를 어떤 생성자로 만들었는 지 확인 후 Lion 생성자면 Lion 타입으로, Tiger 생성자면 Tiger 타입으로 캐스팅을 해줘야 합니다.
이럴 때 필요한 키워드가 instanceof 키워드 입니다.
☞ instanceof 키워드
- 캐스팅 가능 여부를 확인 (불리언 타입)
- 참조변수 instanceof 타입
public void test2() {
Animal[] arr = new Animal[4];
arr[0] = new Lion();
arr[1] = new Tiger();
arr[2] = new Lion();
arr[3] = new Tiger();
for(int i = 0; i < arr.length; i++) {
arr[i].say();
if(arr[i] instanceof Lion)
((Lion)arr[i]).punch();
else if(arr[i] instanceof Tiger)
((Tiger)arr[i]).kick();
}
}
@콘솔출력값
안녕하세요, 동물 입니다.
라이언 펀치!
안녕하세요, 동물 입니다.
타이거 킥!
안녕하세요, 동물 입니다.
라이언 펀치!
안녕하세요, 동물 입니다.
타이거 킥!
arr[i] instanceof Lion → arr[i]이 Lion으로 캐스팅이 가능하니?
Lion 객체라면 true가 반환되어 if문 내의 Lion 타입으로 다운 캐스팅하여 punch()메소드가 출력 됩니다.
false라면 else if 문이 수행되고,
else if(arr[i] instanceof Tiger) → arr[i]이 Tiger로 캐스팅이 가능하니?
Tiger 객체라면 true가 반환되어 if문 내의 Tiger 타입으로 다운 캐스팅하여 kick()메소드가 출력됩니다.
이렇게 instanceof 키워드를 사용하면,
상속 관계나 객체를 만든 생성자를 직접 확인하지 않고도 캐스팅 가능 여부를 확인할 수 있습니다.
따라서 잘못된 캐스팅에 의한 실행 예외(ClassCastException)으로 프로그램이 종료되는 것을 방지해줍니다.
Lion lion = new Lion();
System.out.println(lion instanceof Lion);
System.out.println(lion instanceof Animal);
System.out.println(lion instanceof Object);
@콘솔출력값
true
true
true
위와 같은 상속 구조를 띄고 있기 때문에 모두 true가 리턴 됩니다.
instanceof 뒤의 타입은 참조 변수가 표현될 수 있는 모든 다형적 타입을 의미합니다.
'Java > Java' 카테고리의 다른 글
abstract 제어자) 추상 메소드, 추상 클래스, 익명 이너 클래스 (0) | 2022.03.24 |
---|---|
다형성) 다형성의 활용(매개변수 선언부, 리턴 타입), 동적 바인딩, 정적 바인딩 (0) | 2022.03.24 |
객체 지향 3대 원칙) 다형성에 대하여, 업 캐스팅, 다운 캐스팅 (0) | 2022.03.24 |
상속) is-a-상속관계, has-a-포함관계, 강집합, 약집합 (0) | 2022.03.22 |
상속) super 키워드, super() 메소드, protected 접근 제한자 (0) | 2022.03.22 |