이 문서는 <객체지향의 사실과 오해 (조영호 지음)>을 읽으며 작성한 개인 노트입니다.
객체지향 설계 안에 존재하는 세 가지 상호 연관된 관점
개념 관점(Conceptual Perspective): 도메인 내 존재하는 개념과 개념들 간 관계를 표현한다. 사용자가 도메인을 바라보는 관점을 반영한다.
명세 관점(Specification Perspective): 사용자의 영역인 도메인을 벗어나, 개발자의 영역인 소프트웨어에 집중한다. 객체가 협력을 위해 무엇을 할 수 있는가에 초점을 맞춰 인터페이스를 설계하는 관점이다. 구현과는 분리된 관점임이 핵심이다.
구현 관점(Implementation Perspective): 실제 작업을 수행하는 코드와 연관되어 있다. 객체가 책임을 어떻게 수행할 것인가에 초점을 맞춰 인터페이스를 구현하는 데 필요한 속성과 메서드를 클래스에 추가한다.
위 세 가지 관점은 설계 및 개발의 순서가 아닌, 하나의 클래스를 바라볼 수 있는 여러 관점일 뿐이다.
즉, 클래스는 세 가지 관점을 모두 수용할 수 있도록 개념, 인터페이스, 구현을 함께 드러내야 한다.
명세 관점은 클래스의 안정적인 측면을 드러내고, 구현 관점은 클래스의 불안정한 측면을 드러내야 한다.
인터페이스가 구현 세부 사항을 노출하기 시작하면 아주 작은 변동에도 전체 협력이 요동치는 취약한 설계를 얻을 수 밖에 없다.
추상화는 도메인의 복잡성을 단순화하고 직관적인 모델을 만드는 수단이다.
추상화 기법은 다음과 같다
자동차
라는 분류를 자동차 A
, 자동차 B
, 자동차 C
로 인스턴스화한다자동차
는자동차 A
, 자동차 B
, 자동차 C
의 부모 타입이다.분류:
슈퍼타입과 서브타입
서브타입
is a 슈퍼타입
: 서브타입은 슈퍼타입의 부분집합이다상속은 다음 두 가지 용도로 쓰인다
위임(delegation):
패키지 또는 모듈: 관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성 요소