코딩 이야기

JAVA 객체타입확인 본문

JAVA

JAVA 객체타입확인

별메아리 2023. 2. 15. 09:44
728x90

객체 타입 확인

강제 타입 변환은 자식 타입이 부모타입으로 변환되어 있는 상태에서만 가능하기 때문에 다음과 같이 처음부터 부모 타입으로 생성된객체는 자식 타입으로 변환할 수 없습니다.

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  연산자로 변환시킬 타입의 객체인지 조사해서 잘못된 매개값으로 프로그램이 종료되는 것을 막아야 합니다.

728x90

'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
Comments