Skip to content

객체지향의 사실과 오해

책 링크

image

목적

객체지향에 대한 개념 정리

학습 상태

  • 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)라고 부른다.
  • 의인화 : 현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징

은유

  • 객체지향의 세계와 현실 세계 사이에는 모방이나 추상화의 수준이 아닌 다른 관점에서 유사성을 가지고 있을 뿐이다.
  • 은유 : 실제로 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 형태.
  • 객체에 현실 세계인 도메인에서 사용되는 이름을 부여하는 것은 표현적 차이를 줄일 수 있으며, 이해하기 쉽고 유지보수가 용이한 소프트웨어를 만들 수 있다.