instanceof는 타입 검사 연산자일까, 값을 꺼내기 위한 도구일까?
instanceof를 처음 배울 때는 보통 이렇게 배운다.
“객체가 특정 타입의 인스턴스인지 검사하는 연산자”
실제로 정의만 놓고 보면 맞는 말이다.
예를 들어,
if (obj instanceof Person) {
...
}
이 코드는 “obj가 Person 타입인가?”를 검사하는 코드이다.
그런데 생각해 보면, 실제로는 단순히 타입이 궁금해서 instanceof를 사용하는 경우가 거의 없다.
예를 들어
if (obj instanceof Person) {
Person p = (Person) obj;
System.out.println(p.getName());
}
여기서 내가 정말 궁금했던 것은
“이 객체가 Person인가?” 가 아니다.
사실 내가 하고 싶었던 일은
p.getName()
처럼 Person 객체의 메서드나 값을 사용하는 것이다.
즉,
1. Person인지 확인
2. Person으로 형변환
3. 값이나 메서드 사용
이 전체 과정이 목적이다.
왜 굳이 instanceof로 먼저 확인할까?
만약 바로 형변환하면 문제가 생길 수 있다.
Person p = (Person) obj;
만약 obj가 Person이 아니라면,
ClassCastException
이 발생한다.
그래서
if (obj instanceof Person) {
Person p = (Person) obj;
...
}
처럼 먼저 확인한 뒤 안전하게 형변환하는 것이다.
결국 instanceof는 타입 검사를 수행하지만, 실제 사용 목적은 안전한 형변환을 통해 객체의 값을 꺼내기 위함인 경우가 대부분이다.
Java 16 이후에는 더 명확해졌다.
자바는 이런 패턴이 너무 자주 사용된다는 것을 알고 문법을 개선했다.
기존 코드
if (obj instanceof Person) {
Person p = (Person) obj;
System.out.println(p.getName());
}
는 이제 다음처럼 작성할 수 있다.
if (obj instanceof Person p) {
System.out.println(p.getName());
}
이 문법을 보면 의도가 더 잘 드러난다.
Person인지 검사
↓
맞으면 p라는 변수에 담기
↓
바로 사용
즉, 타입 검사 자체가 목적이라기보다, Person 객체를 안전하게 꺼내서 사용하기 위한 과정이라는 점이 더욱 분명해진다.
record와 궁합이 좋다
record Person(String name, int age) {}
Object obj = new Person("김철수", 20);
if (obj instanceof Person p) {
System.out.println(p.name());
System.out.println(p.age());
}
여기서도 내가 진짜 원하는 것은
name 값 사용
age 값 사용
이지,
Person인가?
를 확인하는 행위 자체가 아니다.
instanceof는 그 값을 안전하게 사용하기 위한 입장권 같은 역할을 해주는 셈이다.
정리
- instanceof의 본래 기능은 특정 타입인지 검사하는 것이다.
- 하지만 실무에서의 사용 목적은 대부분 안전한 형변환 후 객체의 값이나 메서드를 사용하기 위함이다.
- Java 16부터는 instanceof Person p 문법이 추가되면서 이러한 의도가 더욱 명확하게 표현된다.
결국 내가 이해한 instanceof는,
타입을 확인하기 위한 연산자이기도 하지만, 실제로는 객체를 안전하게 꺼내서 사용하기 위해 거의 항상 함께 사용되는 도구이다.
'TIL' 카테고리의 다른 글
| [TIL] 객체지향은 ‘생성’과 ‘사용’의 책임을 분리하는 것에서 시작 (0) | 2026.06.22 |
|---|---|
| 자바 Class 객체란? 리플렉션(Reflection) 개념과 사용 이유 (0) | 2026.06.18 |
| 자바 프로그램은 어떻게 실행될까? - JRE, JVM, main() 메서드가 실행되기까지 (0) | 2026.06.17 |
| 객체와 메모리, 메서드 개념 확인 (0) | 2026.06.16 |
| 왜 equals()와 hashCode()를 함께 재정의해야 할까? (0) | 2026.06.15 |