ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 상속(Inheritance)의 개념
    language/JAVA 2019. 1. 17. 14:11
    반응형


    상속을 이용하여 설계할 때는 공통적인 코드를 어떤 클래스에 넣은 다음, 다른 더 구체적인 클래스에 공통적인( 더 추상적인 ) 클래스가 상위 클래스라는 것을 알려주면 됩니다. 한 클래스가 다른 클래스를 상속하는 것을 하위 클래스가 상위 클래스로부터 상속받는다고 말합니다.


    자바에서는 상위 클래스를 확장(extend)한다고 이야기 합니다.







    삼각형은 도형이다


    고양이는 동물이다


    외과의사는 의사이다


    이렇게 A는 B다 관계에 있으면 A 자리에 오는 클래스가 B 클래스를 확장했다고 할 수 있습니다. 이 A는 B다 관계는 한 방향으로만 흘러야 합니다.




    하위 클래스가 상위 클래스를 더욱 더 구체화 한 형식이라면 상속을 활용할 수 있다. 깊이는 얼마든지 깊어질 수 있지만 효율성을 위해서(메모리 낭비) 적당한 깊이를 유지하는 것이 좋다고 합니다.






    상속을 활용해서 설계하면 객체지향의 여러가지 이점을 누릴 수 있습니다.


    공통적으로 필요한 행동을 뽑아서 상위클래스에 집어 넣으면 코드가 중복되는 것을 막을 수 있고 그렇게 하면 그 행동을 수정할 때도 코드를 한 군데만 고치면 그 행동을 상속받은 모든 클래스에서 새로운 변동사항이 자동으로 반영됩니다. 하위 클래스를 건드릴 필요는 전혀 없습니다.


    그리고 상속을 통해서 연관된 일련의 클래스에 대해 공통적인 규약을 정의할 수 있습니다. 앞서서 만든 Animal 클래스는 Animal에 속하는 모든 하위 클래스에게 공통적인 규약을 구축했다고 할 수 있습니다.


    그리고 이 상속을 통해서 다형성을 활용할 수 있습니다.




    Dog 객체를 참조하는 변수는 Dog 유형으로 선언되어야 합니다. 하지만 다형성을 이용하면 레퍼런스 유형을 실제 객체 유형의 상위클래스 유형으로 지정할 수 있습니다.




    이렇게 하면 다형적인 배열을 만드는 것과 같은 일을 할 수 있습니다. 이것은 인자와 리턴 유형에서도 적용이 가능합니다.


    이 때 주의 해야 할 것은 상위 클래스 유형으로 만들어진 변수는 컴파일러에서 상위 클래스 객체를 참조하고 있다고 생각하기 때문에 하위클래스에서 오버라이드 되지 않은 독창적인 메소드에는 접근 할 수 없다는 것입니다.






    이 클래스를 PetShop 프로그램에서도 사용하게 된다면 애완동물용 메소드를 추가해야 한다. 애완동물 Pet 클래스를 하나 더 만들어서 상속시키면 해결됩니다. 이것을 다중상속이라고 부릅니다.




    그런데 자바는 다중상속을 허용하지 않습니다. 다중상속에는 죽음의 다이아몬드(The Deadly Diamond of Death)라고 알려져 있는 문제가 있기 때문입니다. 애매한 상황에 대한 규칙이 필요하기 때문에 자바에서는 다중상속을 지원하지 않는다


    자바는 원래 특정한 상황에서 큰 문제를 일으키지 않는 간단한 언어여야 합니다. 그러면 Pet 클래스를 상속할 수 있는 다른 방법이 필요합니다.



    자바에서는 이를 해결하기위해 인터페이스를 제공합니다. 인터페이스는 모든 메소드를 추상 메소드로 만듭니다 그러면 하위 클래스에서 반드시 메소드를 구현해야 하기 때문에 실행중 상속받은 여러 메소드 가운데 어떤 것을 호출해야 할 지 결정하지 못하는 문제가 생기지 않습니다.






    Object 유형으로 객체를 참조할 때 주의할 점은 참조한 객체의 고유 메소드를 사용할 수 없다는 점 입니다. 컴파일러는 레퍼런스 유형을 기준으로 어떤 메소드를 호출할 수 있는지를 따지기 때문입니다.




    상위 클래스를 확장한다는 개념을 다이어그램으로 표현하면 이 그림과 같이 표현할 수 있을 것입니다. 이 때 만들어지는 Dog 객체를 참조하는 Dog 변수와 역시 이 Dog 객체를 Object 변수는 그림처럼 참조하는 영역의 범위가 다르다고 이해할 수 있습니다. Object 변수를 버튼 숫자가 더 작은 리모콘이라고 생각할 수 있습니다




    오른쪽 코드에서 처럼 캐스트연산자를 써서 그 사본을 강제로 Dog 변수로 만들 수 있습니다.

    반응형
Designed by Tistory.