이전 걸음에서 참조 자료형 변환에 대해서 자료형 기준으로 객체를 사용을 할 수 있고 부모의 자료형인 경우 자식의 속성과 기능이 사용이 불가능 하며 또한 참조 자료형을 쓰면 좋은 이유에 대해서 부모의 자료형으로 자식을 다 받을 수 있는 부분이 있고 마지막으로 한계는 자료형 기준이기 때문에 자식 객체의 것을 사용을 할 수 없습니다.이번 걸음에서는 참조 자료형 변환을 조금 더 확실하게 알아보도록 하겠습니다.
이번 걸음에서는 참조 자료형 변환을 해서 메소드 매개변수를 부모 자료형으로 받아도 문제 없이 동작이 되도록 하는 방법과 문제가 없이 동작이 되더라도 참조 자료형 변환에 최종 한계에 대해서 이번 걸음에서 이야기를 하도록 하겠습니다.
부모 자료형에서 본래 자료형으로 형 변환을 하는 다운 캐스팅을 하기 위한 필수적인 instanceof와 그 instanceof를 사용해서 문제 없이 동작이 되더라도 효율적이지 않는 문제에 대해서 이번 걸음에서 심도 있게 이야기를 해보겠습니다.
참조 자료형 변환과 instanceof
위의 사진을 보면 부모 오리 2마리와 여러 새끼 오리고 보입니다. 이 사진을 보여 드린 이유는 위와 같은 사진처럼 부모를 상속 받는 많은 자식이 있는 경우 메소드 선언시 부모의 자료형으로 어떤 자식도 받을 수 있게 됩니다. 그러면 여러 자식의 매개변수로 여러 개의 메소드를 생성을 하는 것이 아니라 부모의 매개 변수로 하는 메소드를 하나만 만들 수 있게 됩니다.
이전 걸음에서 말한 부모는 자식의 속성과 기능을 볼 수 없기 때문에 메소드 안에서 다운 캐스팅 작업을 해줘야 합니다. 이때 사용되는 예약어가 instanceof 입니다. 이 예약어는 현재 객체가 뒤에 선언된 class가 있는지 확인을 해서 true, false를 반환해주는 예약어 입니다.
class A{}
class B{}
A a = new A();
B b = new B();
if(a instanceof A)
if(b instanceof A)
위와 같이 객체에 A가 있는지 확인을 하면 1번은 true가 나와서 실행되고 2번은 false가 나와서 실행이 되지 않습니다.
그 다음에서 실제 상속을 통해서 사용되는 instanceof를 확인을 해주세요.
참조 자료형 변환 메소드 완성
위 사진을 보면 알겠지만 변수는 도형으로 하고 각각의 객체는 삼각형 사각형이 있습니다. 이렇게 선언이 된다면 메소드에서 도형으로 매개변수를 받아서 사용을 한다면 삼각형이랑 사각형은 도형을 매개변수로 하는 메소드에서 사용이 가능합니다. 하지만 사용이 될 때에는 당연히 삼각형, 사각형으로 변환 되어서 사용이 되어야 하는데 이때 알 수 있는 것이 위에서도 나온 instanceof 입니다.
밑에서 부모와 여러 자식을 두고 예제소소를 만들어 보겠습니다.
class A{}
class B extends A{}
class C extends A{}
class D extends A{}
class E extends A{}
class F extends A{}
class G extends A{}
static void abc(A a){
if(a instanceof B){
B b = (B)a;
}
if(a instanceof C){
C c = (C)a;
}
if(a instanceof D){
D d = (D)a;
}
if(a instanceof E){
E e = (E)a;
}
if(a instanceof F){
F f = (F)a;
}
if(a instanceof G){
G g = (G)a;
}
}
위와 같이 instanceof로 실제 객체를 확인하고 자료형을 다운 캐스팅을 해서 형 변환을 통해 사용을 하면 됩니다.
참조 자료형 변환 한계
위에 설명처럼 참조 자료형 변환 하나를 쓴다면 당연히 효율 적일 수 없습니다. 위와 같이 하나의 메소드를 사용을 했지만 조건문을 통해 다운 캐스팅을 하기 때문에 소스의 양이 줄지 않은 것을 알 수 가 있습니다.