세상을 뚜렷한 경계를 지닌 객체들의 집합으로 바라보는 것은 인간의 선천적으로 타고난 인지 능력이다.
우리는 이미 객체지향적인 사고를 하고 있다. 하지만 많은 사람들이 객체지향의 본질과 중심을 제대로 이해하지 못한 상태에서 객체지향 프로그래밍을 하며 오류를 범하고 자신의 생각에서 모순을 찾게 된다. 나도 이 책을 읽으며 나의 생각이 일차원적이고 짧았다는 사실을 깨달았으며 객체지향에 대한 근본적인 이해와 시야를 넓힐 수 있게 되었다.
많은 책과 강의에서 객체지향이 실세계를 모방하는 것이라고 표현한다. 이러한 표현은 실무적인 관점에서는 부적합하지만 개념을 설명하는 데에는 적절하고 효과적이기 때문에 오해의 여지가 있음에도 불구하고 많은 책과 강의에서 사용한다. 즉, 이는 교육용 표현이다.
객체지향의 목표는 실세계를 모방하는 것이 아닌 새로운 세계를 창조하는 것이다.
현실과 프로그램의 거리는 '모방'이라는 단어를 꺼내기 무안할 정도로 멀다. 우리는 이를 인지하고 실재에 얽매이지 않아야 한다.
객체지향에서 가장 중요한 개념 세 가지는 역할, 책임, 협력이다.
간단히 표현하자면,
역할 : 직업명
책임 : 하는일
협력 : 공통 목적을 가진 역할들의 도움 관계
- 역할은 의미적으로 책임이라는 개념을 내포한다.
ex) 선생님이라는 역할은 학생을 가르칠 책임이 있음을 암시한다.
- 책임이 불분명한 객체는 애플리케이션의 미래 역시 불분명하게 만든다.
- 협력은 객체들의 요청(request)과 응답(response)으로 구성된다. 협력을 위해 객체 간 메시지를 주고받는다.
(메시지를 받은 객체가 이 메시지를 처리하는 방법을 메소드(Method)라 한다.)
협력을 위한 객체의 역할과 책임의 특징
- 여러 사람이 동일한 역할을 수행할 수 있다. ex) 바리스타 A, 바리스타 B, C, D 모두 동일한 바리스타다.
- 역할은 대체 가능(substitutable)하다.
- 책임을 수행하는 방법은 자율적으로 선택할 수 있다. = 동일 요청에 대해 다른 방식으로 처리할 수 있다 : 다형성(polymorphism)
- 한 사람이 동시에 여러 역할을 수행할 수도 있다.
객체(Object)
객체란 협력에 참여하는 주체로, 상태(state)와 행동(behavior), 식별자(identity)를 함께 지니는 실체라고 정의한다.
객체의 조건
1. 객체는 협력적이어야 한다.
- 다른 객체들과 조화롭게 협력하며 애플리케이션을 구현한다.
2. 자율적이어야 한다.
- 객체는 공동의 목표를 달성하기 위해 협력에 참여하지만 스스로의 결정과 판단에 따라 행동한다.
객체의 구성
1. 상태(state)
: 특정 시점에 객체가 가지고 있는 정보의 집합.
- 과거의 행동에 얽매이지 않고 행동의 과정과 그 결과를 단순하게 기술할 수 있는 요소.
: 객체의 과거 행동 로그를 기억하지 않고 최종 결과만 상태에 기록하여 단순화시킨다는 것이다.
- 상태를 구성하는 모든 요소를 객체의 프로퍼티(property)라 하며, 이는 변하지 않는 정적이다.
- 프로퍼티의 값으로 행동의 결과를 나타내며 이는 행동에 따라 변하기 때문에 동적이다.
- 프로퍼티 값을 바탕으로 객체가 특정 행동을 취할 수 있는지 판단한다.
- 프로퍼티의 종류
- 링크(link) : 객체와 객체 사이 의미 있는 연결. 링크를 통해서만 다른 객체와 메시지 주고받기가 가능하다.
- 속성(attribute) : 링크와 달리 객체를 구성하는 단순한 값.
2. 행동(behavior)
: 객체의 상태를 변경하는 것은 객체의 자발적인 행동뿐이다.
- 객체의 상태를 결정하는 것은 행동이지만 행동의 결과를 결정하는 것은 상태다. 즉, 행동의 결과는 객체의 상태에 의존적이다.
- 협력하는 다른 객체에 대한 메시지를 전송할 수도 있다.
- > 객체의 행동을 통해 다른 객체와 협력하므로 행동은 외부에 가시적이어야 한다.
- > 협력하는 객체를 생성할 때에는 상태가 아닌 행동에 초점을 맞추어 설계해야 한다.
객체지향 설계는 애플리케이션에 필요한 협력을 생각하고 협력에 참여하는데 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 수행된다.
3. 식별자(identity)
: 객체를 서로 구별할 수 있는 특정한 프로퍼티. (객체가 아닌 단순한 값은 식별자를 가지지 않는다.)
값(value)과 객체(Object)
값(value)
- 변하지 않는 양을 나타낸 것. 값의 상태는 변하지 않음.
- 두 값의 상태가 같다면 두 값은 같은 것이라 함.
- 따라서 값은 구분하기 위한 별도의 식별자가 필요하지 않다.
객체(Object)
- 행동을 통해 시간에 따라 변경되는 상태를 포함.
- 두 객체의 타입이 완전히 같고 상태도 같더라도 이들은 독립적인, 다른 객체로 다뤄야 함.
- 객체들이 같은지 다른지 판단할 수 있는 기준이 바로 식별자. 식별자가 같다면 둘의 상태가 다르더라도 같은 객체로 판단.
동등성(equality) : 상태를 이용해 두 값이 같은지 판단할 수 있는 성질.
동일성(identical) : 식별자를 기반으로 객체가 같은지 판단할 수 있는 성질.
식별자를 지닌 객체를 참조 객체(reference object) 또는 엔티티(entity)라 한다.
객체지향 설계의 묘미는 다른 객체와 조화롭게 협력할 수 있을 만큼 충분히 개방적인 동시에, 협력에 참여하는 방법을 스스로 결정할 수 있을 만큼 충분히 자율적인 객체들의 공동체를 설계하는 데 있다.
객체지향의 본질
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
- 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메소드를 자율적으로 선택한다.
객체지향의 핵심은 클래스가 아니라 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다.
'Book Report' 카테고리의 다른 글
양자컴퓨터의 이해 (0) | 2022.01.27 |
---|---|
객체지향의 사실과 오해 - 3장 (0) | 2022.01.24 |
운의 알고리즘 (0) | 2022.01.06 |
단 1줄로 사로잡는 전달의 법칙 (0) | 2021.12.26 |
메타버스의 시대 (0) | 2021.12.08 |