본문 바로가기
도서/프로그래밍

[07][完] 객체지향의 사실과 오해 - 함께 모으기

by POWER_ESFJ 2024. 1. 1.

 

 

코드와 모델을 밀접하게 연관시키는 것은 코드에 의미를 부여하고 모델을 적절하게 한다. - 에릭 에반스(Eric Evans)[Evans 2003]

 

마틴 파울러는 [UML Distilled 2판]에서 객체지향 설계 안에 존재하는 세 가지 상호 연관된 관점에 관해 설명한다. 파울러는 세 가지 관점을 각각 개념 관점, 명세 관점, 구현 관점이라고 부른다.

 

개념 관점(Conceptual Perspective)에서 설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현한다. 사용자가 도메인을 바라보는 관점을 반영하여 실제 도메인 규칙과 제역을 최대한 유사하게 반영하는 것이 핵심이다.

 

명세 관점(Specification Perspective)에 이르면 소프트웨어 안에서 살아 숨쉬는 객체들의 책임에 초점을 맞추게 된다. 즉 인터페이스를 바라보게 된다. 인터페이스와 구현을 분리하는 것은 훌륭한 객체지향 설계를 낳는 가장 기본적인 원칙이라는 점을 기억하라

 

구현 관점(Implementation perspective)은 프로그래머인 우리에게 가장 익숙한 관점으로, 실제 작업을 수행하는 코드와 연관돼 있다. 인터페이스를 구현하는 데 필요한 속성과 메서드를 클래스에 추가한다.

 

위 세가지 관점은 순서가 아니라 동일한 클래스를 세 가지 다른 방향에서 바라보는 것을 의미한다.

도메인

메뉴판과 메뉴 항목은 관계 또는 합성(composition) 관계를 나타내는 마름모로 표시

손님 타입은 메뉴판 타입을 알고 있어야 커피를 선택할 수 있지만, 메뉴판 타입은 소님의 일부가 아니므로, 이 관계는 합성 관계가 아니다. 이 경우 단순한 선으로 표시, 이를 연관(association) 관계라고 한다.

설계하고 구현하기

메시지를 설계

 

커피를 주문하라(메뉴 이름)

이 메시지를 처리하는데 책임이 있는 개체는 무엇인가? 손님 객체이다.

 

손님은 메뉴를 모른다. 메뉴를 알려면 다음 메시지를 던저야 한다.

 

메뉴 항목을 찾아라(메뉴 이름) : 메뉴 항목

⇒ 메뉴판 객체에 이 메시지에 대한 책임 할당

 

커피를 제조하라(메뉴 항목): 커피

⇒ 바리스타에게 할당

인터페이스 정리하기

받금 얻어낸 것이 객체들의 인터페이스이다.

⇒ 실제 자바코드로 인터페이스 생성(구현X)

구현하기

order 메서드 실제 구현

더보기

구현하지 않고 머릿속으로만 구상한 설계는 코드로 구현하는 단계에서 대부분 변경된다. 구상하는 단계에 너무 오랜 시간을 쏟지 말고 최대한 빨리 코드를 구현해서 설계에 이상이 없는지, 설계가 구현 가능한지를 판단해야 한다. 코드를 통한 피드백 없이는 깔끔한 설게를 얻을 수 없다. 설계를 간단히 끝내고 최대한 빨리 구현에 돌입하라

 

축하한다. 모든 구현이 끝났다.

이제 여러분은 객체지향적인 설계와 구현이 무엇인지를 위해하기 시작했을 것이다.

메시지가 객체를 결정한다는 말의 의미, 책임에 따라 설계가 이뤄지는 과정, 인터페이스와 구현의 분리와 같은 다양한 이슈에 대해 어렴풋하게나마 개념을 잡을 수 있었기를 바란다.

코드와 세 가지 관점

훌륭한 객체지향 프로그래머는 하나의 클래스 안에 세 가지 관점을 모두 포함하면서도 각 관점에 대응되는 요소를 명확하고 깔끔하게 드러낼 수 있다.

근데 실제로 현업에서 쓰면 수많은 하나의 요구사항을 만족 시키기위해 수많은 객체들이 생성 될 것이고 이들을 구현하기위해 클래스가 생성이 될 것인데, 보통 interface하나에 servieImpl 하나 구축하는 현재 SI 프로젝트에서, 많은 Service를 추가하면 관리자의 반발을 살 수 있을 것 같다.

⇒ 부록 A에서 패키지를 이용해서 고려해야하는 요소수를 줄일 있다는 내용이 있는데, 패키지로 한 번 감싸서 해봐겠다.