디지안의 개발일지
[TIL] 객체지향의 사실과 오해 본문
들어가기 전에
조영호님의 책 객체지향의 사실과 오해을 읽으면서 중요하다고 생각되는 부분들을 정리하려고 한다. 제대로 이해하려면 책을 꼭 구매해서 봐야할 듯하다.
이 책의 목적
이 책은 객체지향 프로그래밍 고수를 만들기 위한 책은 아니다. 단지 객체 지향에 대한 시야를 지금까지 보지 못했던 방향으로 보게 해주는 책이라고 저자가 소개하고 있다. 더불어, 객체지향에 대한 기본적인 지식들을 배울 수 있는 책으로 보인다.
핵심은 객체지향에 대한 시각, 기본적인 지식을 배울 수 있는 책으로 추측이 된다.
협력하는 객체들의 공동체
객체들은 역할, 책임, 협력 이 세가지에 의해 구성이 된다. 예를 들어, 각 객체는 어떤 역할을 가지고 있고 그 역할에 따라 협력하는 관계에서 책임을 지게 된다. 여기서 재밌는 점은 아래와 같은 4가지다.
1. 여러 객체가 동일한 역할을 수행할 수 있다.
2. 역할은 대체 가능성을 의미한다.
3. 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
4. 하나의 객체가 동시에 여러 역할을 수행할 수 있다
위와 같은 특징에서 객체의 역할은 유연하고 재사용 가능한 협력 관계를 구축하는데 중요한 설계요소임을 상기할 수 있다.
협력하는 객체는 다음과 같은 두가 덕목을 갖춰야 한다.
1. 객체는 협력적이어야 한다. 모든 것을 스스로 처리하는 전지전능한 객체는 내부적인 복잡도에 의해 자멸한다.
2. 객체는 자율적이어야 한다. 스스로의 원칙에 따라 어떤 일을 하거나 스스로 통제할 수 있어야 한다.
객체는 상태와 행동을 가지고 있다. 각 객체는 자신들만의 행동을 가지고 있고 외부에서는 이 행동이 무엇을 하는지는 알지만 어떻게 하는지는 알 필요가 없다. 행동을 어떻게 할지에 대해서 자율적인 것이다. 과거의 개발은 데이터와 프로세스를 명확하게 나눴지만 객체가 데이터와 자신의 프로세스를 가짐으로써 자율성이 보장이 되면 유지보수가 쉽고 재사용이 용이한 시스템을 구축할 수 있다.
객체지향의 본질적인 특징은 다음과 같다.
1. 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
2. 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다.
3. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의집합이다.
4. 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.
객체 지향 프로그래밍에서 클래스는 중요한 구성요소이지만 중심 개념은 아니다. 자바스크립트도 객체 지향 프로그래밍을 할 수 있지만 프로토타입을 기반으로 객체지향 프로그래밍을 한다. 객체지향의 핵심 개념은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구착하는 것이다. 클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중해야한다.
이상한 나라의 객체
사람은 사람이 가진 인지능력을 통해서 현실에 있는 물체들을 객체로 인지한다. 현실 세계에서의 객체와 프로그래밍에서의 객체의 차이는 프로그래밍에서의 전등은 사람의 손길이 없이 스스로 불을 밝힐 수 있는 것이다.
객체는 상태, 행동, 식별자로 구성이 된다. 먼저 상태를 살펴보자. 상태라를 기준을 만드는 것은 과거 행동에 따라 나타난 행동 결과들을 모두 기록할 수 없기 때문에 단순화시킨 것이다. 객체의 상태는 크게 2가지로 분류될 수 있다. 기본적으로 숫자, 문자열, 양, 속도, 시간, 날짜등의 단순한 값들이 있는데 이는 속성(attribute)라고 한다. 때로는 다른 객체를 통해서 객체의 상태를 표현해야할 때도 있다. 이를 프로퍼티(property)라고 부른다. 객체의 프로퍼티는 해당 객체와 의미있는 연결을 가지고 있기 때문에 이를 링크(link)라고 한다.
객체의 자율성을 유지하기 위해서는 객체의 상태를 외부에서 변경하기보다는 자체적으로 변경하게 해야한다. 이 자체적으로 변경하게 하는 것이 행동이다. 그렇기 때문에 객체의 행동은 상태에 영향을 받고 객체의 행동은 상태를 변경시킨다.
객체는 자신이 가진 책임과 역할이 있기 때문에 이를 수행하여 협력하는 객체들의 공동체 참여하기 위해 노력한다. 그 방법은 다른객체에 요청을 보내는 것이다. 요청에 따라 객체 자신의 상태를 변경하거나 행동 내에서 협력하는 다른 객체에 대해 메시지를 전송하여 부수 효과를 낸다.
사물과 객체의 재밌는 차이는 사물은 스스로 자신의 상태를 변경할 수 없지만 객체는 스스로 자신의 상태를 변경해야한다는 점이다. 전등의 불을 현실세계에서 사람이 꺼야하지만 객체의 세계에서는 사람이 전등을 끄라는 메시지를 요청하면 전등 스스로가 행동을 통해서 불을 꺼야한다.
각 객체는 식별할 수 있다. 식별할 때 사용하는 기준은 식별자다. 식별자를 가지지 않는 것은 값(value)라고 호칭한다. 값의 중요한 특징은 변하지 않는다는 것이다.
지금까지 한 내용을 요약하면 다음과 같다.
1. 객체는 상태를 가지며 상태는 변경 가능하다.
2. 객체의 상태를 변경시키는 것은 객체의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 실행 결과에 영향을 미친다.
3. 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체의 상태를 조회하는 작업은 쿼리(query)라고 하고 객체의 상태를 변경하는 작업은 명령(command)라고 한다.
객체지향을 설계할 때 처음으로 접하는 사람들은 객체의 상태를 먼저 결정하는 것이다. 단점은 다음과 같다.
- 캡슐화가 저해된다.
- 객체를 고립된 섬으로 만든다.
- 객체의 저사용성이 저하된다.
협력하는 객체를 설계하기 위해서는 상태보다 행동에 초점을 맞춰야 한다. 대표적인 이유는 객체가 협력할 때 사용하는 행위가 행동이기 때문이다. 그렇기 때문에
애플리케이션에 필요한 협력을 생각하고 협력에 참여하는 데 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 설계를 진행해야한다. 그리고 행동에 따라 필요한 정보가 무엇인지를 고려하여 필요한 상태를 결정해야한다. 결과적으로 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야한다. 이를 책임-주도 설계라고 한다.
흔히 객체지향은 현실세계를 모방한다라는 개념을 가졌다. 하지만 거기서 큰 차이점은 객체는 능동적으로 행동을 할 수 있도록 의인화해야한다는 것이다. 객체지향은 현실세계를 모방하기보다는 은유한다는 표현이 더 맞다. 소프트웨어 객체는 현실 객체의 일부 의미가 옮겨지지만 그 이상의 의미가 담기기 때문이다.
타입과 추상화
추상화란 복잡함을 단순화하는 것을의 의미한다. 단순화 하는 과정을 두 단계로 나눠볼 수 있다.
첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다.
두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것이다.
마무리
책의 첫번째 장만 읽었는데 그 동안 생각하지 못한 점을 짚어주는 것 같다. 반드시 사서 보길 권장한다.
'book' 카테고리의 다른 글
[TIL] 가상 면접 사례로 보는 대규모 시스템 설계 기초 - 5장 (0) | 2022.03.15 |
---|---|
[TIL] 가상 면접 사례로 보는 대규모 시스템 설계 기초 - 4장 (0) | 2022.03.10 |
[TIL] 가상 면접 사례로 보는 대규모 시스템 설계 기초 - 2장 (0) | 2022.03.08 |
[TIL] 가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 1장 (0) | 2022.03.06 |
[TIL] Effective Kotlin을 읽어보자 - 1 장 (0) | 2022.03.06 |