티스토리 뷰

이 콘텐츠는 아래와 같은 사전 지식이 필요합니다.

 

  • 상속
  • 오버 라이딩

 

이 콘텐츠는 아래와 같은 내용을 담고 있습니다.

 

  • 업 캐스팅
  • 다운 캐스팅
  • 실전 예제

 


 

이 콘텐츠는 다음과 같은 포스팅과 연관이 있습니다. 참조하십시오.

 

 

 


 

지난 콘텐츠인 오버 라이딩과 오버 로딩에 이은 추가 포스이다. 이해가 필요하다면 위의 url 참고 바란다.

 

 

 

 

Up-Casting

 지난 포스팅에 이어 고양이 이야기를 먼저 해보자. 우선 두 고양이의 상속관계는 다음과 같다.

 

 

 ChildCat(이하, 아기 고양이)이 사춘기가 왔다고 가정하자. 아기 고양이는 본인이 아기 고양이가 아니라 부모 고양이처럼 듬직하고 생각해서, 부모처럼 행동하고 싶어 한다. ParentCat(이하, 부모 고양이)에게서 모든 것을 배웠다고 생각한 아기 고양이 본인이 부모 인척 위장한다. 이 아기 고양이가 부모 고양이처럼 행동하려면 어떻게 할까? 부모처럼 보이기 위해서, 자신의 어린 행동은 안 할 것이다. 하지만 아직 아기 고양이기 때문에 부모만이 할 수 있는 행동을 할 수는 없을 것이다. 그림의 예로는 아기 고양이는 careMyKid() 행위는 할 수가 없을 것이다. (왜? 해본 적이 없는 부모 고유의 행동이니까!)

 

 

 

이것을 OCP 언어인 JAVA에 대입해보자.

 자식 클래스는 부모 클래스를 상속받았기 때문에 부모 클래스처럼 위장(이하, TypeCast or 형 변환)할 수 있다. 그러나 자식 클래스가 부모 클래스로  형 변환이 되었다면, 자신의 고유의 메서드는 사용을 할 수가 없다. 부모 클래스의 private 한 필드와 메서드는 자식 클래스에서는 알 수가 없기(invisible) 때문에 그러한 행동 또한 할 수 없다.

 

 

 업 캐스팅이란, 파생 클래스가 슈퍼클래스로 타입캐스팅 되는 것을 의미한다. 위의 고양이 예제와 같이, 파생클래스가 슈퍼 클래스로 형 변환되어 사용은 가능하다. 다만 자신의 고유자원과 슈퍼클래스의 고유 자원은 사용할 수 없다.

 

 여기서 특이한 점은 부모 인척 하는 고양이가 eat() 메서드를 수행할 때 일어난다. 부모의 eat() 메서드가 나와야 할 것 같지만 출력해보면, 아기 고양이의 eat()이 호출된다. 왜? '우선(Override)'되기 때문에 아무리 부모 인척 해도 오버라이드 된 메서드가 호출되는 것이다.

public class CatSimulator {

    public static void main(String[] args) {
  


        //부모 클래스 변수를 자식 고양이 인스턴스와 매핑 
        ParentCat pretendingMotherCat = new ChildCat();
        //eat 호출 
        pretendingMotherCat.eat();

    }
}

 

 

 

 

Down-Casting

 

업 캐스팅과 반대의 스토리를 생각해보자. 이런 미친 일은 없겠지만, 부모 고양이가 아기 고양이를 보고, 자신도 어려지고 싶어서 아기 고양 인척 하고 싶었다. 그래서 억지로 아기 고양이 인척 했다고 쳐보자. 아기 고양이의 눈으로 생각해보니,  careMyKid() 같은 자신의 고유 기능들도 숨겨해야 했다. 하지만 문제는 지금부터다. 이 부모 고양이는 현세대 고양이들이 무슨 말을 하는지 알아들을 수가 없었다. 세대 차이를 극복할 수 없었던 것이다. 다른 아기 고양이들이 "머선 129?"라고 묻자. 부모 고양이는 현세대의 언어습관에 분노하여 클래스 차이를 보이며 익셉션을 일으킬 것이다.

 

 

public class CatSimulator {

    public static void main(String[] args) {
        ParentCat pCat = new ParentCat();
        ChildCat cCat = new ChildCat();

        ChildCat pretendingChildCat = (ChildCat)new ParentCat();
        pretendingChildCat.getAge();
    }
}

 

이 코드는 언뜻 보면 문법적인 오류(Compile Error)는 없다. 그러나 런타임 시 바로 오류를 뱉는다.

 

ClassCastException

 이 역시 대입하여 설명하자면, 아래와 같이 설명할 수 있다.

부모 클래스가 자식 클래스로 형변환 된다면, 상속관계이므로 문법상의 오류는 없기에 컴파일은 가능하다. 그러나 자식의 자원에 접근 할 수 없으므로, 런타임 중 Cast Exception으로 사용할 수 없다.

 

그럼 다운 캐스팅은 왜 있는 걸까?

 다운 캐스팅은 부모 클래스를 자식클래스로 캐스팅하기 위한 것이 아니다. 부모 클래스로 업 캐스팅된 자식 클래스를 다시 다운 캐스틍하여, 본인의 필드와 기능을 회복하기 위해 있는 것이다. 즉, 원래 있던 기능을 회복하기 위해 사용된 다는 것이다.  

 

public class CatSimulator {

    public static void main(String[] args) {
        ParentCat pCat = new ParentCat();
        ChildCat cCat = new ChildCat();

        ParentCat pretendingMotherCat = new ChildCat();
        
        pretendingMotherCat.eat();
        ((ChildCat)pretendingMotherCat).eat("츄르");
        
        
    }
}

 위의 코드처럼 ParentCat으로 캐스팅되었지만, 다운 캐스팅으로 인해 자신의 오버 로딩 메서드인 eat(something) 메서드를 다시 사용할 수 있게 된다.

 

 

 


포스팅에 문제가 있거나, 설명이 잘못된 부분 지적 환영합니다.

더 나은 퀄리티의 콘텐츠를 제공할 수 있도록 노력하겠습니다.

읽어주셔서 감사합니다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함