Categories: Java 언어Korean

Java 총 정리[67. 참조 자료형 변환 심화 2]

참조 자료형 변환 심화 2

이전 걸음에서 참조 자료형 변환에 대해서 자료형 기준으로 객체를 사용을 할 수 있고 부모의 자료형인 경우 자식의 속성과 기능이 사용이 불가능 하며 또한 참조 자료형을 쓰면 좋은 이유에 대해서 부모의 자료형으로 자식을 다 받을 수 있는 부분이 있고 마지막으로 한계는 자료형 기준이기 때문에 자식 객체의 것을 사용을 할 수 없습니다.이번 걸음에서는 참조 자료형 변환을 조금 더 확실하게 알아보도록 하겠습니다.

이번 걸음에서는 참조 자료형 변환을 해서 메소드 매개변수를 부모 자료형으로 받아도 문제 없이 동작이 되도록 하는 방법과 문제가 없이 동작이 되더라도 참조 자료형 변환에 최종 한계에 대해서 이번 걸음에서 이야기를 하도록 하겠습니다.

부모 자료형에서 본래 자료형으로 형 변환을 하는 다운 캐스팅을 하기 위한 필수적인 instanceof와 그 instanceof를 사용해서 문제 없이 동작이 되더라도 효율적이지 않는 문제에 대해서 이번 걸음에서 심도 있게 이야기를 해보겠습니다.

참조 자료형 변환과 instanceof

위의 사진을 보면 부모 오리 2마리와 여러 새끼 오리고 보입니다. 이 사진을 보여 드린 이유는 위와 같은 사진처럼 부모를 상속 받는 많은 자식이 있는 경우 메소드 선언시 부모의 자료형으로 어떤 자식도 받을 수 있게 됩니다. 그러면 여러 자식의 매개변수로 여러 개의 메소드를 생성을 하는 것이 아니라 부모의 매개 변수로 하는 메소드를 하나만 만들 수 있게 됩니다.

이전 걸음에서 말한 부모는 자식의 속성과 기능을 볼 수 없기 때문에 메소드 안에서 다운 캐스팅 작업을 해줘야 합니다. 이때 사용되는 예약어가 instanceof 입니다. 이 예약어는 현재 객체가 뒤에 선언된 class가 있는지 확인을 해서 true, false를 반환해주는 예약어 입니다.

class A{}

class B{}

A a = new A();

B b = new B();

  1. if(a instanceof A)
  2. 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로 실제 객체를 확인하고 자료형을 다운 캐스팅을 해서 형 변환을 통해 사용을 하면 됩니다.

참조 자료형 변환 한계

위에 설명처럼 참조 자료형 변환 하나를 쓴다면 당연히 효율 적일 수 없습니다. 위와 같이 하나의 메소드를 사용을 했지만 조건문을 통해 다운 캐스팅을 하기 때문에 소스의 양이 줄지 않은 것을 알 수 가 있습니다. 

    
void abc(B b){}
void abc(C c){}
void abc(D d){}
void abc(E e){}
void abc(F f){}
void abc(G g){}
    

위 소스를 보시면 더욱 차이가 없음을 알 수 있습니다. 하지만 추후에 나올 오버라이딩 개념과 함께 쓰인다면 엄청난 시너지 효과를 낼 수 있습니다. 이번 걸음을 마지막으로 참조 자료형 변환에 대해서 알아봤습니다.

Dolphin

Recent Posts

Java 총정리[97. Java GUI]

Java GUI Java GUI에 대해서 이번 걸음에서 배움으로써 GUI에 전반적인 지식과 Java GUI를 구현하는 방법…

7개월 ago

Java 총정리[96. Java TCP 통신 프로그램 구현]

Java TCP 통신 프로그램 구현 Java TCP 통신 프로그램 구현을 위해서 이전 걸음에서 쓰레드에 대한…

7개월 ago

Java 총정리[95.쓰레드 통신]

쓰레드 통신 이전 걸음에서 쓰레드의 임계영역에 대해서 같이 공부를 했습니다. 동기화에 대한 개념을 계속적으로 하고…

7개월 ago

Java 총 정리[94. 쓰레드 임계영역]

쓰레드 임계영역 이전 걸음에서 쓰레드의 동기화에 대해서 같이 공부를 했습니다. 동기화에 대한 전반적인 내용을 공부하고…

8개월 ago

Java 총 정리[93. 쓰레드 동기화]

쓰레드 동기화 이전 걸음에서 계속 쓰레드에 대해서 공부를 하고 있습니다. 쓰레드는 상당히 중요한 개념이기 때문에…

8개월 ago

Java 총 정리[92. 쓰레드 join()]

쓰레드 join() 이전 걸음에서 쓰레드의 전반적인 실행 흐름에 대해서 공부를 했습니다. 이제 배운 실행 흐름…

8개월 ago

This website uses cookies.