읽고쓰고

[책] 객체지향의 사실과 오해 - 1

별토끼. 2021. 10. 9. 03:51
반응형

차근차근 비유법을 써서 설명해주는 책이었다. 객체지향의 개념에 대해 좀 더 직관적으로 이해할 수 있는 계기가 되었다. 중요하다고 생각되는 부분들을 요약했는데, 두고 두고 객체 지향에 대한 개념이 흔들릴 때마다 봐야겠다.

목표

  • 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고 전환
  • "행동이 상태를 결정한다" 를 이해하자.

1. 협력하는 객체들의 공동체

기능을 구현하기 위해 객체들은 협력한다. 책에서는 협력의 과정을 "커피를 주문하는 과정"을 예시로 아주 상세하게 풀어준다.

"커피를 주문하는 과정"은 대략 이러하다.

  1. 손님이 캐시어에게 커피를 주문한다.
  2. 캐시어가 바리스타에게 커피 제조를 요청한다.
  3. 바리스타는 커피를 완성하여 캐시어에게 건내준다.
  4. 캐시어는 커피를 완성하여 손님에게 준다.

역할과 책임, 협력

"커피를 주문하는 과정"에 손님, 캐시어, 바리스타라는 '역할' 이 존재한다. 각 역할은 맡은 책임을 수행해내야 한다. 그 책임을 수행하기 위해 다른 사람에게 도움을 요청하기도 하고, 연쇄적인 요청과 응답으로 구성되는 협력 관계가 완성된다.

얼마나 적절한 책임을 선택하느냐 = 애플리케이션의 아름다움

역할은 관련성 높은 책임의 집합이다. 역할은 아래와 같은 특징을 갖는데, 유연하고 재사용 가능한 협력 관계를 구축하는데 중요한 설계 요소가 된다.

  • 여러 객체가 동일한 역할을 수행할 수 있다.
  • 역할은 대체 가능성을 의미한다.
  • 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
  • 하나의 객체가 동시에 여러 역할을 수행할 수 있다.

상태와 행동을 지닌 자율적인 객체

객체가 자율적 존재로 남기 위해서는 필요한 상태(state)와 행동(behavior)을 지니고 있어야 한다.

  • 현실 : 내가 음료를 마신다.
  • 프로그래밍 : 내가 음료에게 음료를 마시겠다고 요청 -> 음료는 자신의 음료 양을 줄임

메시지를 통한 협력

자율적인 객체가 협력하기 위해서 사용하는 것은 "메시지"이다. 메시지를 전송하는 객체와 메시지를 수신하는 객체 사이의 관계로 구성된다.

메서드와 자율성

객체가 수신한 메시지를 처리하는 방법은 "메서드"이다. 이때 중요한 것은 외부 요청을 표현하는 메시지와 요청 처리를 위한 메서드를 분리하는 것이다. 이 분리가 객체의 자율성을 높이는 핵심 메커니즘이며, 캡슐화(encapsulation) 와 관련되어 있다.

훌륭한 객체지향을 위해서

클래스의 관점을 탈피해 메시지를 주고 받는 객체의 관점으로 사고 전환을 해야한다. 어떤 클래스가 필요한가가 아니라, 어떤 객체들이 어떤 메시지를 주고 받으며 협력하는가이다.

오해하지 말 것

객체지향의 핵심은 클래스가 아니다. 책임을 수행하는 역할 간 유연하고 견고한 협력 관계 구축이다. 클래스는 협력에 참여하는 객체를 만드는데 필요한 구현 메커니즘일 뿐이다. 클래스를 지향하는 것이 아니므로 오해하지 말자.

2. 이상한 나라의 객체

책에서는 "이상한 나라의 앨리스" 이야기를 한다. 앨리스가 크고 작은 문을 통과하기 위해 "행동"을 하고, 이를 통해 상태를 바꾸며 문을 통과하는데 성공하는 이야기 말이다. 하지만 아무리 상태가 변경되더라도 앨리스는 앨리스이다. 유일한 존재로 식별이 가능하다는 것이다. 이게 객체 지향과 무슨 연관일까? 상태, 행동, 식별자를 지닌 실체라는 것이다. 객체 역시 이 세가지를 갖고 있는 실체이다.

상태

상태는 행동의 결과이다. 행동의 결과를 예상할 수 있는 한가지 방법은 모든 행동을 기억하는 것이다. 번거롭다. 그래서 상태라는 개념이 나타난 것이다. 상태를 이용하면 과거 이력을 설명하지 않고도 결과를 예측할 수 있다.

객체는 자율적인 존재임을 명시하자. 다른 객체의 상태에 직접 접근할 수도, 상태를 변경할 수도 없다. 이는 행동을 통해서만 변경할 수 있다.

프로퍼티

객체는 단순한 값과 객체의 조합으로 표현된다. 객체를 구성하는 모든 특징을 통틀어 프로퍼티라고 한다. (앨리스의 키, 위치, 음료 등..) 프로퍼티 자체는 보통 변경되지 않지만 프로퍼티의 값은 시간의 흐름에 따라 변경된다.

행동

행동에 따라 객체의 상태가 변화한다. 행동의 주체뿐 아니라, 다른 객체의 상태도 변경된다.

  • 객체 자신의 상태 변경
  • 행동 내에서 협력하는 다른 객체에 대한 메시지 전송

행동이 상태를 결정한다.

객체지향 갓 입문자들이 쉽게 빠지는 함정은 "상태"를 중심으로 객체를 바라보는 것이다. 객체가 필요한 상태가 무엇인지 결정한 후, 필요한 행동을 결정한다는 것이다. 이는 아래와 같은 나쁜 영향을 준다.

  1. 캡슐화 저해
    상태가 객체 내부로 캡슐화 되지 못하고, 공용 인터페이스에 노출된다.
  2. 객체가 협력자가 아닌 고립된 섬이 된다.
    문맥 내 다른 객체와 협력하지 못하는 객체가 창조된다.
  3. 객체의 재사용성 저하
    다양한 협력 참여가 어려워 재사용성이 저하된다.

객체의 행동은 결국 책임을 의미한다. 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 한다. 협력이라는 문맥 안에서 객체의 행동을 생각하도록 도움으로써 응집도 높고, 재사용 가능한 객체를 만들 수 있게 한다.

반응형