03. 자바와 객체 지향
상속: 재사용 + 확장
지난 글 '스프링 입문을 위한 자바 객체지향의 원리와 이해2'에서 상속과 관련하여 Inheritance라는 단어가 적절하지 않다고 말씀드렸었죠. 그 이유는 상속 개념이 '유산을 상속하다'할 때의 뜻과 다르기 때문입니다. 오히려 '재사용 + 확장'으로 이해하는 것이 맞습니다. 그래서 키워드도 extends
를 쓰는 것입니다. 예를 들어 상위 클래스로 '포유류'가 있고 하위 클래스로 '침팬지'가 있다면 '침팬지가 포유류를 상속받다'가 되어야 하는데 이 개념을 모르는 사람이 처음에 이를 이해하기엔 어려운 것이죠. 이런식으로 '재사용 + 확장'의 개념으로 이해한다며 상위 클래스로 갈수록 추상적, 포괄적으로 되고 하위 클래스로 갈수록 구체적, 특수적으로 되는 것입니다.
또 하나 짚고 넘어가야 할 것은 '상속은 is a 관계가 되어야 한다'라는 개념인데요. 물론 이렇게 이해하도 맞습니다. 전에 상속 관련한 정리를 할 때도 이렇게 설명을 했었구요. 하지만 저자는 좀 더 정확한 표현을 설명하는데요. 'is a kind of'(~의 한 부류이다) 라는 것입니다. 기존에 'is a'관계의 경우 '하위 클래스 is a 상위 클래스'가 성립되어야 하는데요. 이것을 풀어 설명하면 '하위 클래스는 상위 클래스 중에 하나다' → '상위 클래스 중에 하나란 말은 객체를 말하는 것인가?' → '상위 클래스도 하위 클래스와 같이 모두 추상적 개념인데 객체로 보는 것인가?' 와 같은 의문이 들 수 있습니다. 따라서 이 경우 'is a kind of'로 이해하면 '하위 클래스는 상위 클래스의 한 분류이다'로 적절하게 해석할 수 있습니다.
다중 상속해서 자바가 이를 지원하지 않는 이유는 간략하게 설명하면 득보다 실이 많기 때문입니다. 다중 상속에 가능하다는 전제하 책에 나온 예를 들면 '인어'는 '사람'과 '물고기'를 상속 받을 수 있습니다. 이 때 '사람'과 '물고기'에 '수영하다()'라는 메서드가 정의되어 있고 '인어'에서 '수영하다()'라는 메서드를 실행시킨다면 사람의 팔과 다리로 수영을 해야할지, 물고기의 지느러미와 꼬리로 수영을 해야할지 혼동이 생긴다는 것입니다.
조금 전에 상속은 'is a kind of' 관계로 설명될 수 있다고 말씀드렸습니다. 그럼 인터페이스는 어떻게 설명할 수 있을까요? 인터페이스도 'is a kind of'관계로 설명할 수 있지만 지난 세월 속에서 조금은 다르게 사용하는게 유용하다는 결론에 도달하게 되었다고 합니다. 이것도 한 마디로 말하자면 'is able to'(무엇을 할 수 있는)로 설명할 수 있습니다. 즉 '구현 클래스 is able to 인터페이스'인 것이죠. 자바에서 쓰이는 인터페이스 중에 'Serializable', 'Clonable', 'Comparable'등의 인터페이스를 본 적이 있을 겁니다. 이런 개념이 적용된 것입니다.
상위 클래스는 물려줄 특성이 풍부할 수록 좋고, 인터페이스는 구현을 강제할 메서드가 적을수록 좋다는 것은 왜 일까?
이제는 상속에서 T메모리가 어떻게 사용되고 있는지 살펴보도록 하겠습니다.
이제는 Tmemory만 봐도 코드가 어떻게 구성되어 있는지 좀 보이지 않나요? 상속의 경우 힙 영역에서 Animal
을 상속받는 Dolphin
을 위와 같이 나타낼 수 있습니다. 근데 각 객체 참조 변수가 가르키는 것을 보면 다른데요. 이건 왜 그럴까요? 이는 선언시 참조 변수 타입을 다르게 하였기 때문입니다.
Dolphin suu = new Dolphin();
Animal gari = new Dolphin();
여기서 gari
는 Animal
타입으로 선언하였기 때문에 Animal
에 있는 것만 사용할 수 있습니다. 저자에 따르면 '자신이 돌고래이지만 이를 까먹고 동물이라는 것만 기억하는 것이죠'. 물론 이 경우 캐스팅하여 하위 클래스에 구현된 부분을 사용할 수도 있습니다. 이에 대한 내용은 지난 상속 글을 참고해주세요.
다형성과 관련한 내용은 T메모리 부분만 잠깐 살펴보겠습니다.
Animal
을 상속받는Dolphin
에서 showName()을 Override한 것을 알 수 있습니다. 이 경우 Dolphin
객체에 있는 showName()이 Animal
에 있는 showName()을 가렸기(재정의) 때문에 객체 변수 타입이 Animal
이든 Dolphin
이든 재정의된 내용으로 구현되게 됩니다.
'Book > programming' 카테고리의 다른 글
스프링 입문을 위한 자바 객체지향의 원리와 이해6 (2) | 2018.10.27 |
---|---|
스프링 입문을 위한 자바 객체지향의 원리와 이해5 (0) | 2018.10.21 |
스프링 입문을 위한 자바 객체지향의 원리와 이해3 (0) | 2018.10.18 |
스프링 입문을 위한 자바 객체지향의 원리와 이해2 (0) | 2018.10.14 |
스프링 입문을 위한 자바 객체지향의 원리와 이해1 (4) | 2018.10.14 |