Instanceof
-
참조변수의 인스턴스타입을 확인하며 boolean값을 반환.
void work (Car c) { if(c instanceof FireEngine) { FireEngine fe = (FireEngine)c; fe.water(); ... } else if(c instanceof Ambulance) { Ambulance a = (Ambulance)c; a.siren(); ... } }
Car 클래스의 참조변수 c가 어떤 인스턴스타입인지 확인하여 작업을 수행한다. 조상타입의 참조변수로는 실제 인스턴스 멤버들을 모두 사용할 수 없기 때문에 실제 인스턴스와 같은 타입의 참조변수로 형변환해야만 인스턴스의 모든 멤버를 사용할 수 있다.
-
instanceof의 결과가 true면 그 타입으로 형변환해도 문제가 없다는 뜻이다.
FireEngine fe = new FireEngine(); fe instanceof FireEngine // true fe instanceof Car // true fe instanceof Object // true class Car {} class FireEngine extends Car {}
FireEngine클래스는 Object, Car클래스로부터 상속받았기 때문에 FireEngine 인스턴스는 Object 인스턴스와 Car 인스턴스를 포함하고 있는 셈이기 때문에 모두 true를 반환한다.
참조변수와 인스턴스 연결
-
예시
public class Main { public static void main(String[] args) { Parent p = new Child(); Child c = new Child(); System.out.println(p.x); // prints 200 System.out.println(c.x); // prints 100 p.method(); // prints "Child Method" c.method(); // prints "Child Method" } } class Parent { int x = 200; void method(){ System.out.println("Parent Method"); } } class Child extends Parent { int x = 100; void method(){ System.out.println("Child Method"); } }
Child
의 인스턴스인데,Parent
타입의 참조변수인 경우와 child 타입의 참조변수인 경우에는 차이점이 있다.첫번째는 참조할 수 있는 멤버의 범위가 다르다는 것이고, 두번째는 접근하는 멤버변수가 달라진다는 것이다.
위의 예시에서 조상클래스
Parent
의 인스턴스 변수 x, 메서드 method는 자식클래스Child
에서 중복 정의되고 오버라이딩되었다. 이 때 메서드의 경우, 동일하게 자식클래스의 메서드 즉 오버라이딩된 메서드를 출력하지만, 변수의 경우 참조타입의 멤버변수로 접근한다.만약 인스턴스 변수를 중복 정의하지 않은 경우, 선택의 여지가 없기 때문에 조상클래스의 멤버를 호출한다.