instanceof는 참조변수가 참조하고 있는 실제 클래스 또는 인터페이스인지 확인하는데 사용합니다.
보통 new 연산자를 통해 직접 클래스를 참조하는데 뭐가 문제가 될 수 있을까? 라고 생각할 수도 있을거 같습니다. 다음 예시를 살펴봅시다.
ex)
public class Animals {
public static void doSound(Animals animals) {
if (animals instanceof Dog) {
Dog dog = (Dog) animals;
dog.sound();
} else if (animals instanceof Cat) {
Cat cat = (Cat) animals;
cat.sound();
}
else {
System.out.println("noting!");
}
}
}
public class Dog extends Animals{
public void sound() {
System.out.println("멍멍!");
}
}
public class Cat extends Animals{
public void sound() {
System.out.println("야옹~");
}
}
이렇게 instanceof 키워드를 사용하면 좋은 점은
하지만 instanceof를 사용하면 안좋은 점은
객체는 자신이 무엇인지 알아야 한다
를 어기기 때문에 객체지향적인 설계를 할 수 없습니다.이런 단점을 해결하기 위해서는 Overriding
을 사용하면 됩니다. 그럼 예시 소스를 살펴보겠습니다.
오버로딩에 관한 개념이 부족하시다면 https://velog.io/@pak4184/Java-오버로딩과-오버라이딩 를 읽어보고 오시는걸 추천드립니다.
ex)
public abstract class Animals {
public abstract void makeSound();
}
public class Dog extends Animals {
@Override
public void makeSound() {
System.out.println("멍멍입니두!");
}
}
public class Cat extends Animals {
@Override
public void makeSound() {
System.out.println("야옹입니두~");
}
}
위 코드를 살펴보면 똑같이 Animals 클래스가 부모클래스 역할을 하고 있습니다. 하지만
이렇게 되면 instanceof 키워드를 사용하지 않을 수 있습니다.
참고
https://kchs94.tistory.com/225
https://mine-it-record.tistory.com/120