Spring/스프링입문을 위한 자바객체지향의 원리와 이해

instanceof 연산자

1space 2025. 7. 1. 14:29

스프링입문을 위한 자바 객체지향의 원리와 이해』로 공부한 내용을 정리한 글입니다.

 

instanceof 연산자란?

instanceof는
객체가 어떤 클래스의 인스턴스인지, 또는 어떤 인터페이스를 구현했는지를 확인하는 연산자입니다.

형식:

객체참조변수 instanceof 클래스명
  • 이 결과는 true 또는 false로 반환됩니다.
  • 해당 객체가 그 클래스(또는 자식 클래스)의 인스턴스라면 true, 아니면 false입니다.

 

instanceof는 객체의 ‘실제 타입’을 기준으로 판단합니다

즉, 변수의 선언된 타입이 아닌, new로 생성된 실제 객체가 기준입니다.

예시 1: 클래스 상속 관계

class Animal {}
class Dog extends Animal {}

public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();   // 부모타입으로 자식 객체 참조
        System.out.println(a instanceof Dog);     // 👉 true
        System.out.println(a instanceof Animal);  // 👉 true
        System.out.println(a instanceof Object);  // 👉 true
    }
}
  • a는 Animal 타입으로 선언되어 있지만, 실제 생성된 객체는 Dog입니다.
  • 따라서 instanceof Dog는 true입니다.

 

인터페이스 관계에서도 사용 가능

interface Eatable {}
class Apple implements Eatable {}

public class Main {
    public static void main(String[] args) {
        Eatable e = new Apple();
        System.out.println(e instanceof Apple);    // 👉 true
        System.out.println(e instanceof Eatable);  // 👉 true
        System.out.println(e instanceof Object);   // 👉 true
    }
}
  • Apple은 Eatable 인터페이스를 구현했기 때문에 instanceof Eatable도 true입니다.

 

instanceof는 잘못 쓰면 디자인이 잘못됐다는 신호일 수 있다

instanceof는 객체의 구체적인 타입을 직접 검사하는 것이기 때문에
다형성(Polymorphism)의 원칙에 어긋날 수 있습니다.

 

LSP (리스코프 치환 원칙)와 관련

  • LSP란: 부모 타입의 객체를 자식 객체로 치환해도 프로그램이 제대로 작동해야 한다는 원칙
  • instanceof는 보통 자식 클래스인지 조건문으로 구분해서 동작을 다르게 하기 때문에,
    이 원칙을 어기고 있을 가능성이 높습니다.

그래서 instanceof가 보이면 설계가 잘못됐을 수 있다는 "냄새"로 보고,
리팩터링 대상인지 고민해보라는 말이 자주 나옵니다.

 

정리

사용법 참조변수 instanceof 클래스/인터페이스
반환값 true 또는 false
판단 기준 참조변수의 타입이 아니라, 실제 생성된 객체의 타입
주의사항 너무 자주 쓰면 다형성 원칙(LSP) 위반 가능성 → 리팩터링 검토 대상

'Spring > 스프링입문을 위한 자바객체지향의 원리와 이해' 카테고리의 다른 글

객체 지향 설계의 품질을 높이기 위한 SOLID 원칙  (0) 2025.07.02
인터페이스  (0) 2025.07.01
final 키워드  (0) 2025.07.01
static 블록  (0) 2025.07.01
캡슐화  (0) 2025.06.30