본문 바로가기

자바

업캐스팅 / 다운캐스팅 - 참조변수의 형변환 instanceof

형변환은 상속을 통한 인스턴스에서 사용할 수 있는 멤버의 범위를 조절하기 위함이다.


업캐스팅은 조상타입으로 형변환하는 것을 말하는데 생략할 수 있다. 생략할수있는 이유는 조상으로 거슬러 올라가면 갈 수록 사용할 수 있는 멤버범위가 더 좁아지거나 같아지기 때문이다.


조상타입을 자손타입으로(더 많은 멤버개수를 사용하도록) 변형하는 것을 다운캐스팅 - 생략불가능(다운캐스팅은 업캐스팅되어 있는 것만 가능하다)

자손타입을 조상타입으로(더 적은 멤버개수를 사용하도록) 변형는 것을 업캐스팅 - 생략가능


// 1.서브클래스(주입해준 참조주소,WolfDog wd)의 오버라이딩한 메소드만 호출 가능

// 2.슈퍼클래스(참조변수타입,Dog dog3)의 메소드 호출 가능

// 3.서브클래스(주입해준참조주소, WolfDog wd)의 멤버는 사용불가능

// 4.슈퍼클래스(참조변수타입,Dog dog3)의 참조변수타입에 해당하는 멤버만 사용가능


형변환은 참조타입의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.

단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것뿐이다. 


instanceof


참조변수가 실제로 가리키고 있는 인스턴스타입을 알아보기위한 연산자.


주로 조건문에 사용되며 instanceof의 왼쪽에는 참조변수 오른쪽에는 타입(클래스명)이 피연산자로 위치한다. 그리고 true나 false를 리턴한다.


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 an Object instance.");

}

}

}


class Car{}

class FireEngine extends Car{}


위의 예제의 결과는

This is a FireEngine instance.

This is a Car instance.

This is an Object instance.


모두 true 이다.


true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 의미한다.