4. 시너지를 생각하라. 전체는 부분의 합보다 크다.
- 스티븐 코비(Stephen R. Covey)
그럼, 우리는 왜 객체지향을 해야되는가?
5. 객체지향프로그래밍
(Object-Oriented Programming)
: 객체지향이란 실세계를 직접적이고 직관적으로
모델링할 수 있는 패러다임
: 객체지향이란 실세계를 직접적이고 직관적으로
모델링할 수 있는 패러다임
소프트웨어 시스템이 해결하려고 하는 실재는
잘해봐야 먼 친척밖에는 되지 않는다.
- 버트란드 마이어(Bertrand Meyer)
: 새로운 세상을 창조하는 것.
6. 객체를 스스로 생각하고/스스로 결정하는
현실 세계의 생명체에 비유하는 이유는
상태와 행위를 ‘캡슐화’하는 소프트웨어와 객체의 ‘자율성’
그리고,
현실 세계의 사람들이 ‘암묵적인 약속과 명시적인 계약’을 기반으로 협력하여
목표를 달성해 나가는 과정은 ‘메시지’를 주고 받으며
공동의 목표를 달성하기 위해 ‘협력’하는
객체들의 관계를 설명하기에 적합하기 하며,
실세계의 사물을 기반으로 소프트웨어 객체를 식별하고
구현까지 이어간다는 개념은
객체지향 설계의 핵심 사상인 ‘연결완전성(seamlessness)’ 에 적합한 틀
10. Customer Casher Barister
커피 주문 커피 제조
커피 완성커피 완성
여러사람이동일한역할을수행할수있다.
: 손님입장에서 자신이 주문한 커피는 누가 만들든 상관 X
역할은대체가능성을의미한다.
: 손님입장에서 캐시어는 대체 가능(substitutable)
책임을수행하는방법은자율적으로선택할수있다.
: 요청을 받은 사람들은 요청을 처리하는 방법을 자유롭게 선택할 수 있다.
한사람이동시에여러역할을수행할수있다.
: 캐시어와 바리스타라는 개인적인 역할을 이용해 협력관계를 묘사했지만
한 사람이 캐시어와 바리스타의 역할을 동시에 수행하는 것이 가능
11. 그래서 객체지향이란?🤪
🙌 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고
객체를 이용해 시스템을 분할하는 방법.
🙌 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 개체를 의미
🙌 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력하며,
각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합.
🙌 객체는 다른 객체와 협력하기 위해 메시지를 전송하고,
메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택.
12. 훌룡한 객체지향 설계자가 되기 위해 거쳐야 할 첫 번째 도전은 코드를 담는 클래스의 관점에
서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환하는 것이다.
중요한 것은 어떤 클래스가 필요한가가 아니라 어떤 객체들이 어떤 메시지를 주고받으며 협
력하는가다. 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하다. 클래스는 객체
지향 세계의 도시전설이다.
13. 손님 객체
바리스타 객체
카라멜 마키아또 객체
에스프레소 객체
카푸치노 객체
아메리카노 객체
아메리카노 객체
카푸치노 객체
카라멜 마키아또 객체
에스프레소 객체
손님은 메뉴판에서
커피를 선택할 수 있다.
손님은 바리스타에게
커피를 주문한다.
커피를 제조한다.
Menu
19. 코드는 세 가지 관점을 모두 제공해야 한다.
🐳 개념 관점
🐳 명세 관점
🐳 구현 관점
Customer, Menu, MenuItem, Barista, Coffee 클래스
= Customer, Menu, MenuItem, Barista, Coffee 클래스
= 클래스의 인터페이스(협력과 관계 되는)
= 클래스의 내부 구현(ex, 클래스의 메서드와 속성)
20. 인터페이스와 구현을 분리하라.
= 명세 관점과 구현 관점이 뒤섞여 혼란스럽게 만들지 마라.
명세 관점은 클래스의 안정적인 측면 ⬆
구현 관점은 클래스의 불안정한 측면 ⬇
개념적인 관점과 명세 관점 사이는 그렇게 중요하지 않은 경우가 많지만
명세 관점과 구현 관점을 분리하는 것은 매우 중요하다 - 마틴파울러[fowler 1999b]