도찐개찐

[JAVA] instanceof 본문

JAVA

[JAVA] instanceof

도개진 2022. 7. 7. 10:43

instanceof

  • 참조변수가 참조하는 인스턴스의 실제 타입을 체크하는데 사용.
  • 이항연산자이며 피연산자는 참조형 변수와 타입. - 연산결과는 true, false.
  • instanceof의 연산결과가 true이면, 해당 타입으로 형변환이 가능하다.

instanceof의 기본 사용방법은 "객체 instanceof 클래스" 를 선언함으로써 사용합니다.

class Car {
	String color;
	int door;
	
	void drive() { // 운전
		System.out.println("drive, brooo~");
	}
	
	void stop() { // 멈춤
		System.out.println("stop!!!");
	}
}

class FireEngine extends Car { // 소방차
	void water() { // 물
		System.out.println("water shot!!!");
	}
}

public class InstanceofTest {
	public static void main(String[] args) {
		FireEngine fe = new FireEngine();
		
		if (fe instanceof FireEngine) {
			System.out.println("this is a FireEngine instance.");
		}
		
		if (fe instanceof Car) {
			System.out.println("this is a Car instance.");
		}
		
		if (fe instanceof Object) {
			System.out.println("this is a Object instance.");
		}
	}
}

결과 화면

  • 자식 객체는 상위 객체 타입과 instanceof를 하게 되면 true 결과가 나오게 됩니다.
  • 즉, 자식객체는 부모객체로 형변환이 가능 합니다.
  • Object는 모든 자바객체의 부모객체로 모든 객체는 Object 객체로 형변환이 가능 합니다.
class Parent{}
class Child extends Parent{}

public class InstanceofTest {

    public static void main(String[] args){

        Parent parent = new Parent();
        Child child = new Child();

        System.out.println( parent instanceof Parent );  // true
        System.out.println( child instanceof Parent );   // true
        System.out.println( parent instanceof Child );   // false
        System.out.println( child instanceof Child );   // true
    }

}

왜 세번째는 false가 반환되었을까?

instanceof를 위에서 "객체타입 확인", "형변환 가능한지 여부 확인" 이라 말했는데 어렵게 느껴진다면

쉽게 말해 instancof는 해당 클래스가 자기집이 맞는지 확인해 주는것 이라고 생각하면 될것이다.

 

1. parent instanceof Parent : 부모가 본인집을 찾았으니 true

2. child instanceof Parent : 자식이 상속받은 부모집을 찾았으니 true (상속을 받았으니 자기집이라해도 무방하다?)

3. parent instanceof Child : 부모가 자식집을 찾았으니 false (자식집은 자식집이지 부모집은 아니니까)

4. child instanceof Child : 자식이 본인집을 찾았으니 true

 

위에서 설명한것과 마찬가지로 이러나 저러나 본인이 이해하기 쉽게 받아들이면 될 것 같다.

누구한테는 하위클래스니 상위클래스니 하면서 접근하는게 이해가 더 잘 될 수 있으니 말이다.

 

*형변환이 불가능한 즉 타입이 상위클래스도 하위클래스도 아닐경우에는 에러가 난다.

 

 

참고: https://mine-it-record.tistory.com/120 [나만의 기록들:티스토리]

728x90

'JAVA' 카테고리의 다른 글

[JAVA] 제네릭스(Generics)  (0) 2022.07.07
[JAVA] 다형성(polymorphism)  (0) 2022.07.07
[JAVA] 클래스 형변환  (0) 2022.07.07
[JAVA] 상속(Inheritance)  (0) 2022.07.06
[JAVA] 초기화 블럭(initialization block)  (0) 2022.07.06
Comments