객체지향의 사실과 오해
목적
객체지향에 대한 개념 정리
학습 상태
- 01장: 협력하는 객체들의 공동체 (2024.04.14 ~ 2024.04.14)
- 02장: 이상한 나라의 객체 (2024.04.15 ~ 2024.04.17)
- 03장: 타입과 추상화
- 04장: 역할, 책임, 협력
- 05장: 책임과 메시지
- 06장: 객체 지도
- 07장: 함께 모으기
학습 메모
01장: 협력하는 객체들의 공동체
협력하는 사람들
- 객체지향에서 각 객체는 주어진 역할(책임)을 수행한다. 이 과정에서 객체들은 서로 요청과 응답을 주고 받으며 협력한다.
- 대체 가능 (substitutable) : 여러 객체가 동일한 역할 수행 가능, 어떤 객체가 요청을 받는지는 중요하지 않다.
- 다형성 (polymorphism) : 책임을 수행하는 방법을 자율적으로 선택 가능, 요청을 받은 객체 내부에서 어떤 방식으로 요청을 처리하는지는 중요하지 않음
- 한 객체가 동시에 여러 역할을 수행 가능
협력 속에 사는 객체
- 객제는 충분히 '협력적'이여야함, 외부의 도움 없이 모든 것을 스스로 처리하려고 하는 전지전능한 객체 (god object)는 내부적인 복잡도에 의해 자멸할 수 밖에 없음
02장: 이상한 나라의 객체
객체 그리고 소프트웨어 나라
-
각 객체는 아래 3가지를 가진 실체로 본다
-
상태 (state)
- 행동 (behavior)
- 식별자 (identity)
상태 캡슐화
- 객체지향에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재이다.
- 각 객체는 스스로의 상태를 변경할 수 있고, 다른 객체의 상태를 변경하기 위해서는 직접적으로 변경할 수 없고, 해당 객체의 상태를 변경하는 메시지를 전달할 수만 있다. 그 상태를 변경하는 것은 메시지를 전달받은 객체의 묷이다.
- 캡슐화 : 객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않고, 외부에 노출하는 것은 행동뿐이며, 외부에서 이 객체에 접근할 수 있는 유일한 방법은 행동이다.
식별자
- 모든 객체는 식별자를 가지며, 객체가 아닌 단순한 값은 식별자를 가지지 않는다는 것을 의미한다.
- 값은 상태가 변하지 않기 때문에 불변 상태 (immutable state)를 가진다고 말함.
- 값은 서로 같은지 여부를 상태를 통해 판단한다. 두 값이 같은지 판단할 수 있는 동등성(equality)를 가진다.
- 객체는 시간에 따라 변경되는 상태를 포함하기 때문에, 가변 상태 (mutable state)를 가진다.
- 두 객체가 완벽히 똑같은 상태와 행동을 가지도 있더라도, 식별자가 다르면 다른 객체이다.
기계로서의 객체
- 일반적으로 객체가 외부에 제공하는 행동의 대부분은 아래 두가지로 구성된다.
- 명령 (command) : 객체의 상태를 변경하는 작업
- 쿼리 (query) : 객체의 상태를 조회하는 작업
행동이 상태를 결정한다
- 객체지향에 갓 입문한 사람들이 가장 쉽게 빠지는 함정은 상태를 중심으로 객체를 바라본다.
- 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 형향을 끼진다.
- 캡슐화가 저해됨 : 상태에 초점을 맞추면 상태가 객체 내부로 깔끔하게 캡슐화 되지 못하고, 공용 인터페이스에 그대로 노출될 확률이 높아짐
- 객체를 협력적이지 못하게 만듬 : 객체의 주 목적은 다른 객체와 협력하기 위해서다. 상태를 먼저 고려하면 협력에서 멀리 벗어난 객체를 설계하게함.
- 객체의 재사용성이 저하됨 : 다양한 협력에 참여할 수 없는 객체는 재사용성이 저하될 수 밖에 없다.
- 객체의 적합성을 결정하는 것은 상태가 아니라 객체의 행동이다.
- 협력 안에서 객체의 행동은 결국 객체가 협력하면서 완수해야 하는 책임을 의미한다.
- 따라서 책임 주도 설계 (Responsibility-Driven Design, RDD)는 협력이라는 문맥 안에서 객체의 행동을 생각하도록 도움으로써 응집도 높고 재사용 가능한 객체를 만들 수 있게 한다.
은유와 객체
- 객체지향을 "현실 세계의 모방"이라고 보는 관점은 현실 세계의 존재하는 다양한 객체를 모방한 후 필요한 부분만 취해 소프트웨어 객체로 구현하는 과정이다.
- 컴퓨터 속 상품 객체는 실제 상품이 하지 못하는 가격 계산과 같은 행동을 스스로 수행할 수 있다. 이것은 실제 세계의 상품을 단순화/추상화 한것이 아니라 특성이 전혀 다른 어떤 것임을 의미한다.
- 객체지향이 현실을 오롯이 모방하기만 한다는 것은 오해이다.
의인화
- 현실 속 수동적인 존재가 소프트웨어 객체로 구현될 때 능동적으로 변한다. 이것은 의인화 (authropomorphism)라고 부른다.
- 의인화 : 현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징
은유
- 객체지향의 세계와 현실 세계 사이에는 모방이나 추상화의 수준이 아닌 다른 관점에서 유사성을 가지고 있을 뿐이다.
- 은유 : 실제로 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 형태.
- 객체에 현실 세계인 도메인에서 사용되는 이름을 부여하는 것은 표현적 차이를 줄일 수 있으며, 이해하기 쉽고 유지보수가 용이한 소프트웨어를 만들 수 있다.