
“객체지향 소프트웨어는
실세계의 투영이며, 객체란 현실 세계에 존재하는사물에 대한 추상화이다.”하지만, 막상 찾아보면, 애플리케이션을 개발하며 실세계에 직접적으로 대응되는 사물을 발견하긴 힘들다.
즉, 소프트웨어 방화벽과, 실세계의 방화벽의 의미적 거리만큼, 소프트웨어와 실세계 사이에는 어느정도의 의미적 저리가 존재한다하지만,
실세계의 모방이라는 객체지향의 개념은 실무적인 관점에서는 부적합하지만,
객체지향의 기본 사상을 이해하고 학습하기에는 효과적이다
손님
캐시어
바리스타
‘커피 주문’이라는 협력에 참여하는 손님, 캐시어, 바리스타는
주문된 커피가 손님에게 정확히 전달될 수 있도록 맡은 바 역할과 책임을 다하고 있음
이 역할, 책임, 협력이 객체지향의 핵심적인 3가지 요소
사람들은 스스로 해결하지 못하는 문제를 마주치면 이를 해결할 수 있는 사람에게 도움을 요청(request)한다
손님 → 캐시어 : 커피를 주문캐시어 → 바리스타 : 커피를 제조하라요청을 받은 사람은 주어진 책임을 다해 필요한 지식이나 서비스를 제공, 즉, 응답(response)한다
바리스타 → 캐시어 : 커피 완성캐시어 → 손님 : 커피 완성사람들은 다른 사람과 협력하는 과정에서 특정한 역할을 부여받음
손님 : 커피를 주문하는 역할캐시어 : 손님으로부터 커피를 주문받아야 함바리스타 : 주문된 커피를 제조해야 할 책임이 있음즉, 역할에는 책임이 내포되어 있음
사람들이 협력을 위해 특정한 역할을 맡고 적합한 책임을 수행한다는 사실은 몇 가지 중요한 개념을 제시
커피를 주문하고 제작해서 손님에게 전달하는 과정을 객체지향으로 돌려보자면,
사람 = 객체
요청 = 메시지
처리하는 방법 = 메서드
아리스토텔레스 왈 … “인간은 사회적 동물이다”
→ 하나의 목표를 이루기 위해 사람들이 협력한다
→ 하나의 목표에는 더 작은 책임으로 분할된다
→ 각 책임은 책임을 수행할 수 있는 적절한 역할을 가진 사람에 의해 수행된다
→ 협력에 참여하는 개인은 책임을 수행하기 위해 다른 사람에게 도움을 요청하기도 한다
→ 이런 연쇄적인 요청과 응답으로 구성되는 협력 관계가 완성된다
→ 하나의 어플리케이션을 위해 여러 객체가 협력한다
→ 하나의 어플리케이션은 더 작은 책임으로 분할된다
→ 각 책임은 책임을 수행할 수 있는 적절한 역할을 가진 객체에 의해 수행된다
→ 협력에 참여하는 객체는 책임을 수행하기 위해 다른 객체에 도움을 요청하기도 한다
→ 이런 연쇄적인 요청과 응답으로 구성되는 협력 관계가 완성된다
즉, 객체지향 설계는 적절한 객체에게 적절한 책임을 할당하는 것에서 시작되고,
이 책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소
따라서, 얼마나 적절한 책임을 선택하느냐가 어플리케이션의 아름다움을 결정
‘역할’은 관련성 높은 ‘책임’의 집합
객체의 ‘역할’은 다음과 같은 특징을 지님
<협력하는 사람들>에서와 동일한 내용인걸로 보아
객체지향을 이해하기 위해, 실세계의 모방은 아주 뛰어난 방법 !
객체지향의 윤곽은 역할, 책임, 협력이지만, 이 협력에 참여하는 주체는 객체
어플리케이션의 핵심을 차지하는 객체가 가져야 할 두 가지 덕목
요청에 응답할지 말지, 응답한다면, 어떤 방식으로 응답할지, 객체 스스로 결정객체지향 설계의 묘미는 위 두 가지 덕목을 지키는 객체들의 공동체를 설계하는 데에 있음
객체는 상태 와 행동 을 함께 지닌 실체라고 정의함
즉, 객체가 협력에 참여하기 위해 어떤 행동을 한다면,
그 행동을 하는 데 필요한 상태도 함께 지니고 있어야 함
객체가 협력에 참여하는 과정에서 스스로 판단하고 결정하는 자율적인 존재이기 위해
객체의 자율성은 객체의 외부와 내부를 명확하게 구분하는 데에서 결정됨
즉, 객체는 다른 객체가 ‘무엇’을 수행하는지는 알 수 있지만, ‘어떻게’ 수행하는지는 알 수 없어야 함
현실세계에서는 사람들 간의 의사소통 방식이 다양함
하지만, 객체지향에서 객체들 간의 유일한 의사소통 방법은 메시지
즉, 객체들은 메시지를 송신, 수신하며 협력해 나가는 존재들
송신자 : 메시지를 전송하는 객체수신자 : 메시지를 수신하는 객체객체는 다른 객체에게 요청하기 위해 메시지를 전송
수신자 객체는 처리 여부에 대해 판단한 후, 자신만의 방법으로 자율적으로 처리
이 때 처리하는 방법을 메서드 라고 함
그리고, 메시지와, 메시지의 요청을 처리하기 위한 메서드를 분리하는 것이 객체의 자율성을 높이는 핵심 메커니즘
불완전하고 부정확하긴 하지만, 나름의 객체지향의 개념을 포괄하는 내용들
객체지향에서 핵심은 ‘클래스’가 아니라,
적절한 책임을 수행한느 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다