『스프링입문을 위한 자바 객체지향의 원리와 이해』로 공부한 내용을 정리한 글입니다.
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 |