루비로 배우는 객체지향 디자인
처음 구매 했을때는 주변 루비 개발자분들이 좋은책 이라고 해서 구매했지만 막상 읽지를 않고 책장에 꽃혀있던 책을 블로그 포스팅을 위해 꺼내서 읽었습니다.
작성은 각 장에서 깨달은 내용을 적을 예정이고 총 9장까지 있습니다.
책 제목은 루비지만 꼭 루비가 아니더라도 객체지향 디자인을 원하는 사람에게는 좋은 책이라는걸 느꼈습니다.
6. 상속을 이용해 새로운 행동 얻기
기존에 알아보았던 방식 외에도 코드를 공유 할 수 있는 방법으로는 상속이 있습니다.
고전적 상속
- 자동화된 메세지 전달 시스템
- 특정 객체가 이해할 수 없는 메세지를 전달 받을 경우 그 객체는 이 메세지를 다른 객체에게 전달하는데 이런 전달의 관계를 만드는 것
- 하위 클래스를 만드는 것을 통해 정의
상속에서의 메세지는 하위 클래스에서 상위 클래스로 전달되게 됩니다.
지금은 안티패턴이라고 불리지만 자바스크립트의 프로토타입 상속이나 루비의 모듈이 이러한 기능을 제공합니다.
그렇다면 상속은 어떤 상황에서 필요할까요?
하나의 클래스가 여러 개의 서로 다른, 하지만 연관된 타입을 가지고 있다면 이는 상속을 통해 해결 할 수 있는 문제이기 때문에 상속을 사용합니다.
상속 관계를 만드는 과정에서 주의할 점이 몇가지 있습니다. 이 주의점은 상속의 기본 원칙이며 이를 훼손하면 안됩니다.
- 모델링 하는 객체들이 명확하게 일반-특수 관계를 따라야 합니다.
- 올바른 코딩 기술을 사용해야 합니다.
첫번째의 일반-특수 관계의 예시로는 자전거-로드자전거 의 관계를 들면 좋습니다. 즉, 하위 클래스는 상위 클래스의 특수한 형태입니다. 하위 클래스는 상위 클래스의 모든 행동을 갖추고 추가적인 행동을 가지게 되는겁니다.
추상화된 상위 클래스를 작성하는 방식에서 언어마다 특정 클래스를 명시적으로 추상 클래스 선언 해주는 문법을 지원하는 경우가 있는데 대표적으로는 자바의 abstract 키워드가 있습니다. 루비에서는 그런 문법은 아쉽게도 없습니다.
이러한 추상 클래스를 작성할 때 좋은 방법 중 하나로 “추상적인 행동을 위로 올리기"가 있습니다.
이 방법은 기존에 상속이 필요하지 않았을때 정상적으로 동작하던 코드에서 상속이 필요한 상황이 오고 그때 코드를 작성하는 방법 입니다.
상속을 사용하기로 결정되었다면 먼저 상위 클래스를 만들고 하위 클래스들을 작성합니다. 그런데 기존에 있던 코드는 이름만 변경하고 상위 클래스와의 상속 관계를 정의 합니다.
이후 추상적인 부분만을 상위 클래스로 코드를 옮깁니다. 이 과정이 유효한 이유는 기존의 코드에서 추상화 할 부분과 구체화 하는 부분을 쉽게 분류 할 수 있고 기존의 구체화 된 코드를 상위 클래스에 두는게 아닌 하위 클래스에 그대로 둠으로 추상화 되어야 할 상위 클래스에 구체적인 코드가 남지 않게 되는 이점이 있기 때문입니다.
우리가 이런 혹시 모를 문제를 대비해야하는 이유는 내가 실수했을 때의 어플리케이션의 추가 작성 비용을 고려해야만 하기 때문입니다.
이 책의 좋은 점 중에 하나는 이런 수정 사항이 생겼을 때 새로 개발하는 것이 아닌 기존의 코드에서 수정시 비용까지 고려를 항상 해야한다는걸 알려주기 때문에 좋습니다.