logo

자바 인스턴스

  1. 자바 인스턴스
  2. instanceof 연산자의 예
  3. null 값을 갖는 변수에 instanceof 연산자 적용
  4. instanceof 연산자를 사용한 다운캐스팅
  5. 인스턴스 오브 연산자 없이 다운캐스팅

그만큼 자바 인스턴스 연산자 객체가 지정된 유형(클래스, 하위 클래스 또는 인터페이스)의 인스턴스인지 여부를 테스트하는 데 사용됩니다.

Java의 인스턴스 오브는 유형이라고도 합니다. 비교 연산자 인스턴스를 유형과 비교하기 때문입니다. true 또는 false를 반환합니다. null 값을 갖는 변수에 instanceof 연산자를 적용하면 false를 반환합니다.

Java 인스턴스의 간단한 예

현재 클래스를 테스트하는 인스턴스 연산자의 간단한 예를 살펴보겠습니다.

 class Simple1{ public static void main(String args[]){ Simple1 s=new Simple1(); System.out.println(s instanceof Simple1);//true } } 
지금 테스트해보세요
 Output:true 

하위 클래스 유형의 객체는 상위 클래스 유형이기도 합니다. 예를 들어 Dog가 Animal을 확장하는 경우 Dog의 개체는 Dog 또는 Animal 클래스에서 참조될 수 있습니다.

Java 인스턴스 오브 연산자의 또 다른 예

 class Animal{} class Dog1 extends Animal{//Dog inherits Animal public static void main(String args[]){ Dog1 d=new Dog1(); System.out.println(d instanceof Animal);//true } } 
지금 테스트해보세요
 Output:true 

null 값을 갖는 변수가 있는 Java의 인스턴스 오브

null 값을 갖는 변수에 instanceof 연산자를 적용하면 false를 반환합니다. null 값을 갖는 변수에 instanceof 연산자를 적용하는 아래 예제를 살펴보겠습니다.

 class Dog2{ public static void main(String args[]){ Dog2 d=null; System.out.println(d instanceof Dog2);//false } } 
지금 테스트해보세요
 Output:false 

Java 인스턴스 오브 연산자를 사용한 다운캐스팅

하위 클래스 유형이 상위 클래스의 객체를 참조하는 것을 다운캐스팅이라고 합니다. 직접 수행하면 컴파일러에서 컴파일 오류가 발생합니다. 타입 캐스팅을 통해 수행하면 런타임에 ClassCastException이 발생합니다. 하지만 instanceof 연산자를 사용하면 다운캐스팅이 가능합니다.

 Dog d=new Animal();//Compilation error 

타입 캐스팅을 통해 다운캐스팅을 수행하면 런타임에 ClassCastException이 발생합니다.

 Dog d=(Dog)new Animal(); //Compiles successfully but ClassCastException is thrown at runtime 

인스턴스 오브를 사용한 다운캐스팅 가능성

instanceof 연산자를 사용하여 다운캐스팅이 가능한 예를 살펴보겠습니다.

 class Animal { } class Dog3 extends Animal { static void method(Animal a) { if(a instanceof Dog3){ Dog3 d=(Dog3)a;//downcasting System.out.println('ok downcasting performed'); } } public static void main (String [] args) { Animal a=new Dog3(); Dog3.method(a); } } 
지금 테스트해보세요
 Output:ok downcasting performed 

Java 인스턴스를 사용하지 않고 다운캐스팅

다음 예제에 표시된 대로 downcasting은 instanceof 연산자를 사용하지 않고도 수행될 수도 있습니다.

 class Animal { } class Dog4 extends Animal { static void method(Animal a) { Dog4 d=(Dog4)a;//downcasting System.out.println('ok downcasting performed'); } public static void main (String [] args) { Animal a=new Dog4(); Dog4.method(a); } } 
지금 테스트해보세요
 Output:ok downcasting performed 

a가 참조하는 실제 객체는 Dog 클래스의 객체임을 자세히 살펴보겠습니다. 따라서 다운캐스트하면 괜찮습니다. 하지만 다음과 같이 쓰면 어떻게 될까요?

알파벳을 숫자로
 Animal a=new Animal(); Dog.method(a); //Now ClassCastException but not in case of instanceof operator 

Java에서 instanceof의 실제 사용 이해

아래 예제를 통해 instanceof 키워드의 실제 사용법을 살펴보겠습니다.

 interface Printable{} class A implements Printable{ public void a(){System.out.println('a method');} } class B implements Printable{ public void b(){System.out.println('b method');} } class Call{ void invoke(Printable p){//upcasting if(p instanceof A){ A a=(A)p;//Downcasting a.a(); } if(p instanceof B){ B b=(B)p;//Downcasting b.b(); } } }//end of Call class class Test4{ public static void main(String args[]){ Printable p=new B(); Call c=new Call(); c.invoke(p); } } 
지금 테스트해보세요
 Output: b method