코딩 이야기
JAVA 객체타입확인 본문
객체 타입 확인
강제 타입 변환은 자식 타입이 부모타입으로 변환되어 있는 상태에서만 가능하기 때문에 다음과 같이 처음부터 부모 타입으로 생성된객체는 자식 타입으로 변환할 수 없습니다.
Parent parent = new Parent();
Child child = (child) parent; // 강제 타입 변환을 할 수 없음
객체가 어떤 클래스의 인스턴스 인지 확인하기 위해 instanceof 연산자를 사용합니다. instanceof 연산자의 좌항에는 객체가 오고 우항에는 타입이 오는데, 좌항의 객체가 인스턴스이면, 즉 우항의 타입으로 객체가 생성되었다면 true를 리턴하고 그렇지 않으면 false를 리턴합니다.
boolean result =좌항(객체) instanceof 우항(타입)
instanceof 연산자는 주로 매개값의 타입을 조사할 때 사용됩니다. 메소드내에서 강제 타입 변환이 필요할 경우 반드시 매개값이 어떤 객체인지 instanceof 연산자로 확인하고 안전하게 강제 타입 변환을 해야합니다.
public void method(Parent parent) {
if (parent instanceof Child) { //parent 매개변수가 참조하는 객체가 Child인지 조사
Child child = (child) parent;
}
}
타입을 확인하지 않고 강제 타입 변환을 시도한다면 ClassCastException이 발생할 수 있습니다.
다음 예제에서 instanceofExample 클래스에서 method1()과 method2()는 모두 Parent 타입의 매개값을 받도록 선언했습니다.
부모 클래스
package ch07.exam01;
public class Parent {
}
자식 클래스
package ch07.exam01;
public class Child extends Parent {
}
객체 타입 확인
package ch07.exam01;
public class InstanceofExample {
public static void method1(Parent parent) {
if(parent instanceof Child) { // Child 타입으로 변환이 가능한지 확인
Child child = (Child) parent;
System.out.println("method1 - Child로 변환 성공");
} else {
System.out.println("method1 - Child로 변환되지 않음");
}
}
public static void method2(Parent parent) {
Child child = (Child) parent; // classCastExample이 발생할 가능성이 있음
System.out.println("method2 - Child로 변환 성공");
}
public static void main(String[] args) {
Parent parentA = new Child();
method1(parentA); // Child 객체를 매개값으로 전달
method2(parentA);
Parent parentB = new Parent();
method1(parentB); //parent 객체를 매개값으로 전달
method2(parentB); // 예외 발생
}
}
InstanceofExample 클래스에서 method1() 과 method2()를 호출할 경우, Child 객체를 매개값으로 전달하면 두 메소드 모두 예외가 발생 하지 않지만, Parent 객체를 매개값으로 전달하면 metho2()에서는 ClassCastExample이 발생합니다. method1())은 instanceof 연산자로 변환이 가능한지 확인한 후 변환을 하지만, method2()에서는 무조건 변환하려고 했기 때문입니다.
예외가 발생하면 프로그램은 즉시 종료되기 떄문에 instanceof 연산자로 변환시킬 타입의 객체인지 조사해서 잘못된 매개값으로 프로그램이 종료되는 것을 막아야 합니다.
'JAVA' 카테고리의 다른 글
JAVA 인터페이스 (0) | 2023.02.15 |
---|---|
JAVA 추상 클래스 (0) | 2023.02.15 |
JAVA 타입변환과 다형성 (0) | 2023.02.13 |
JAVA 메소드 재정의 (0) | 2023.02.13 |
JAVA 상속 (0) | 2023.02.13 |