instanceOf
연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는데 사용하는 연산자입니다.
instanceOf
를 어떻게 사용하고, 어떻게 동작하는지 알아보겠습니다.
Syntax
Syntax는 다음과 같습니다. object가 type이거나 type을 상속받는 클래스라면 true를 리턴합니다. 그렇지 않으면 false를 리턴합니다.
object instanceOf type
instanceOf 예제
간단히 표현하면 ArrayList와 List 클래스의 구조는 다음과 같습니다.
public class ArrayList<E> implements List {
}
public List {
}
아래와 같이 ArrayList 객체가 있을 때, instanceOf
를 사용하면 이 객체가 ArrayList인지, List로부터 상속받은 클래스의 객체인지 확인할 수 있습니다.
ArrayList list = new ArrayList();
System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);
Output:
true
true
하지만 다음과 같이 Set의 클래스인지 확인해보면 false를 리턴하게 됩니다. ArrayList는 Set도 아니고, Set를 상속하지도 않기 때문입니다.
ArrayList list = new ArrayList();
System.out.println(list instanceof Set);
Output:
false
Object에 대한 instanceOf
모든 클래스는 Object를 상속하기 때문에 object instanceOf Object
는 항상 true를 리턴합니다.
ArrayList list = new ArrayList();
System.out.println(list instanceof Object);
Output:
true
null 객체에 대한 instanceOf
object가 null이라면 instanceOf는 항상 false를 리턴합니다.
ArrayList list = null;
System.out.println(list instanceof Object);
System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);
System.out.println(list instanceof Set);
Output:
false
false
false
false
Generics의 instanceOf
ArrayList<String>
처럼 Generics로 생성된 객체도 동일하게 instanceOf로 타입을 체크할 수 있습니다.
ArrayList<String> list = new ArrayList<>();
System.out.println(list instanceof Object);
System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);
Output:
true
true
true
false
하지만 Generic 클래스 내에서 T
와 같은, 타입이 결정되지 않은 상태에서 instanceOf로 타입 체크는 할 수 없습니다.
T
는 컴파일 과정에서 실제 타입으로 변경되기 때문입니다.
public <T> void printListItem(List<T> list) {
if (T instanceof String) {
for (T item : list) {
System.out.println(item);
}
}
}
위 코드는 다음과 같은 컴파일 에러가 발생합니다.
Error:(41, 13) java: cannot find symbol
symbol: variable T
location: class example.InstanceOf
다음과 같이 List<T>
의 타입을 확인하는 것도 컴파일 에러가 발생합니다.
public <T> void printListItem(List<T> list) {
if (list instanceof List<String>) {
for (T item : list) {
System.out.println(item);
}
}
}
Error:(41, 33) java: illegal generic type for instanceof
Related Posts
- Java - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedWriter로 파일 쓰기
- Java - BufferedReader로 파일 읽기
- Java charAt() 함수 알아보기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기