질문의 역사
instanceof 연산자는 특정 타입(클래스 또는 인터페이스)에 객체가 속하는지 여부를 확인하기 위해 자바에 도입되었습니다. 이는 상속, 다형성 및 이질적인 객체 컬렉션 처리와 관련하여 중요해졌습니다.
문제
타입 소속 여부를 검증하지 않으면 타입 캐스팅 중에 ClassCastException이 발생할 수 있습니다. instanceof를 잘못 사용하면 코드 아키텍처가 악화되고 반 패턴(예를 들어, 다형성 대신 자주 사용하는 경향)을 초래할 수 있습니다.
해결책
instanceof 연산자는 객체가 null이 아니고 검사되는 타입에 속하거나 지정된 인터페이스를 구현하면 true를 반환합니다.
코드 예시:
Object obj = "Hello"; if (obj instanceof String) { String str = (String) obj; System.out.println(str.toUpperCase()); }
주요 특징:
obj == null인 경우 obj instanceof SomeClass는 무엇을 반환하나요?
instanceof는 객체가 null인 경우 검사되는 타입과는 상관없이 항상 false를 반환합니다. 이는 NullPointerException을 방지하기 위해 중요합니다.
인터페이스 소속 여부를 확인하기 위해 instanceof를 사용할 수 있나요?
예. instanceof는 객체가 필요한 인터페이스를 구현하는지 여부를 확인하는 데 사용되며, 특정 클래스에만 국한되지는 않습니다.
코드 예시:
Runnable r = () -> {}; System.out.println(r instanceof Runnable); // true
클래스가 --release 16+로 컴파일되고 instanceof에 대한 패턴 매칭이 이미 도입되면 어떻게 되나요?
Java 16+부터 instanceof 연산자는 패턴 매칭을 지원하므로, 검증 중에 변수를 지정하고 명시적 캐스팅을 피할 수 있습니다.
코드 예시:
Object obj = "Test string"; if (obj instanceof String str) { System.out.println(str.length()); }
instanceof의 남용 (객체 지향 프로그래밍 원칙 위반)instanceof 호출큰 프로젝트에서 비즈니스 처리 로직을 if (obj instanceof X)...의 연속으로 구성했으며, 메서드 오버라이딩을 통해 수행하지 않았습니다. 이로 인해 유지보수가 복잡해졌습니다: 새로운 타입이 등장할 때마다 모든 검사를 수정해야 했습니다.
장점:
단점:
비슷한 프로젝트에서는 확장 가능한 계층 구조를 위해 추상 메서드를 사용했으며, instanceof는 특별한 엣지 케이스를 검사하는 데만 사용했습니다.
장점:
단점: