다형성을 공부하면서 여러 가지 클래스를 상속하다보면, 슈퍼 클래스인 A 클래스를 참조하는 자식 클래스들의 인스턴스가 어떤 클래스를 참조하고 있는지 확인하고 싶다면, instanceof 키워드를 사용하면 된다.
쉽게 얘기해서..
//Parent 를 부모클래스, Child를 자식 클래스라고 가정
Parent parent1 = new Parent();
Parent parent2 = new Child();
이때, Parent 는 자기 자신을 참조할 수 있을 뿐만 아니라, 자식 타입의 Child 인스턴스도 참조할 수 있다.
이럴 때, parent1 과 parent2가 참조하는 인스턴스의 타입을 확인하고 싶다면, instanceof 키워드를 사용하면 된다.
구체적으로 아래와 같은 코드를 실행한다고 가정하자.
public class ObjectPolyExample1 {
public static void main(String[] args) {
Dog dog = new Dog();
Car car = new Car();
action(dog);
action(car);
}
private static void action(Object obj) {
//obj.sound();
//obj.move(); // 컴파일 오류
//객체에 맞게 다운캐스팅 필요
if (obj instanceof Dog dog) {
dog.sound();
} else if (obj instanceof Car car) {
car.move();
}
}
}
메인 메서드는 객체를 생성하고, action 메서드를 호출하는 코드이므로 설명은 생략한다.
우리는 action 메서드를 잘 봐야하는데, action 메서드는 슈슈슈슈슈퍼클래스인 Object 클래스( Object 클래스는 모든 클래스의 최상위 부모 클래스이다 )의 obj 변수를 파라미터로 받는다.
일단 obj는 sound()와 move()를 알수가 없다. -> 왜? 이 두개의 메서드는 자식클래스인 Dog와 Car의 메서드이기 때문.
if (obj instanceof Dog dog) {
dog.sound();
} else if (obj instanceof Car car) {
car.move();
}
조건문을 천천히 해석 해보자.
if (obj instanceof Dog dog) // 만약, obj가 Dog 타입의 인스턴스라면
좀더 설명을 해보자면, obj는 모든 타입을 넘겨 받을 수 있기 때문에, 현재 obj에 dog을 넘겨 받았다고 가정하자.
그러면 다음 처럼 해석이 될 것이다.
if (obj(dog) instanceof Dog) // obj는 dog를 넘겨 받았다. 코드 제일 마지막 dog는 잠시 생략
더 쉽게 해석하면, dog 이 Dog 타입의 인스턴스 인가? 라고 해석할 수 있다.
위의 조건문은 참이므로, 원래는 다음과 같은 로직이 발생한다
if (obj instanceof Dog ) {
Dog dog = (Dog)obj;
dog.sound();
}
이 코드도 설명하자면, obj는 현재 Object 타입(최상위 부모 클래스)의 파라미터이기 때문에, 자식클래스인 Dog의 메서드를 사용하기 위해서는 Dog 타입으로 다운 캐스팅을 해줘야한다
하지만 위 코드를 보완하여 다운캐스팅 하는 과정을 축약할 수 있다
if (obj instanceof Dog dog)
이렇게 되면 코드를 한줄 줄이고 바로 다운캐스팅을 실행하여 dog변수에 obj를 넣을 수 있다
dog.sound(); // dog.sound() 메서드를 호출한다
다운 캐스팅을 통해 우리는 자식 클래스의 sound() 메서드를 사용할 수 있게 되었다.
정리 :
1. 내가 참조하는 인스턴스가 어떤 타입을 참조하는지 알고싶다 -> instanceof 키워드 사용
2. 상위 클래스에서 하위 클래스의 메서드를 호출하고 싶다 -> 다운캐스팅
그럼 오늘도 20000!
'Java > Java' 카테고리의 다른 글
[Java] StringBuilder - 가변 String (1) | 2024.09.26 |
---|---|
[Java] String 클래스에서 사용되는 메서드 (주관적으로 중요한 메서드) (0) | 2024.09.25 |
[Java] 절차 지향 프로그래밍(PP) VS 객체 지향 프로그래밍(OOP) (1) | 2024.09.08 |
[Java] 향상된 for문 (for - each문) (0) | 2024.09.02 |
[Java] Java에서의 스코프(Scope) (0) | 2024.08.31 |