객체지향의 사실과 오해 | 조영호 - 교보문고
객체지향의 사실과 오해 | 객체지향에 대한 선입견을 버려라!『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝
product.kyobobook.co.kr
객체
이상한 나라의 앨리스의 앨리스를 예로 들어보자. 앨리스는 음료를 마시거나 부채질을 하면 키가 작아지고, 케이크를 먹으면 키가 커진다. 이처럼 앨리스가 하는 행동에 따라 앨리스의 상태가 변하게 된다.
즉, 상태에 따라 행동의 결과가 달라진다.
또한 행동의 성공 여부는 이전에 어떤 행동이 발생했는지에 따라 바뀌고, 행동의 순서도 중요하다.
마지막으로 행동에 의해 앨리스의 상태가 변경되더라도 앨리스가 앨리스라는 사실은 변하지 않는다. 따라서 앨리스는 상태 변경과 무관하게 유일한 존재로 식별 가능하다.
- 앨리스는 상태를 가지며 상태는 변경 가능하다.
- 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 결과에 영향을 미친다.
- 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체, 그리고 소프트웨어 나라
💡 객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보이는 것이 가장 효과적이다.
상태
어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다. 생태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 예측할 수 있다.
객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.
- 프로퍼티(property) : 객체의 상태를 구성하는 모든 특징을 통틀어 말한다.
- 일반적으로 프로퍼티는 변경되지 않고 고정되기 때무에 정적이다.
- 프로퍼티 값(property value)은 시간이 흐름에 따라 변경되기 때문에 동적이다.
- 링크(link) : 객체와 객체 사이의 의미있는 연결
- 객체가 다른 객체를 참조하는 값
- 링크를 통해서만 메시지를 주고받을 수 있다.
- 속성(attribute) : 객체를 구성하는 단순한 값
객체의 프로퍼티는 속성과 링크라는 두가지 종류의 조합으로 표현할 수 있다.
💡 상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티값으로 구성된다.
객체의 프로퍼티는 단순한 값과 대른 객체를 참조하는 링크로 구분할 수 있다.
행동
객체가 취하는 행동은 객체 자신의 상태를 변경시킨다.
객체의 행동에 의해 객체의 상태가 변경된다는 것은 행동이 부수 효과(side effect)를 초래한다는 것을 의미한다.
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
객체의 행동은 이 두 가지 관점의 부수효과를 명확하게 서술해야 한다.
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
💡 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다.
행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다.
객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.
캡슐화
객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.
객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 방법 또한 행동뿐이다.
객체의 행동을 유발하는 것은 외부로부터 전달된 메시지지만 객체의 상태를 변경할지 여부는 객체 스스로 결정한다.
상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.
식별자
서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재하는데, 이 프로퍼티를 식별자라 한다.
모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다.
값과 객체의 가장 큰 차이점은 값은 식별자를 가지지 않지만 객체는 식별자를 가진다는 점이다.
값
- 숫자, 문자열, 날짜, 시간 금액 등과 같이 변하지 않는 양을 모델링한다. (불변상태)
- 두 인스턴스의 상태가 같다면 같은 것으로 판단한다.
- 상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성(equality)이라고 한다.
객체
- 객체는 시간에 따른 변경되는 상태를 포함한다 (가변상태) → 동등성을 바탕으로 비교 불가
- 객체는 두 인스턴스의 식별자가 같다면 같은 것으로 판단한다.
- 식별자를 기반으로 객체가 같은지 판단 할 수 있는 성질을 동일성(identical)이라고 한다.
행동이 상태를 결정한다
상태를 중심으로 객체를 바라보는 것은 함정이다.
- 상태를 먼저 결정할 경우 캡슐화가 저해된다.
- 객체를 협력자가 아닌 고립된 섬으로 만든다.
- 객체의 재사용성이 저하된다.
상태가 아닌 행동에 초점을 맞춰야 한다. 행동은 협력에 참여하는 유일한 방법이다.
객체의 적합성을 결정하는 것은 상태가 아니라 객체의 행동이다.
객체지향 설계는 애플리케이션에 필요한 협력을 생각하고 협력에 참여하는 데 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 수행된다.
협력 안에서 객체의 행동은 결국 책임을 의미한다. 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 한다. 책임-주도 설계(Responsibility—Driven Design, RDD)
은유와 객체
객체지향을 현실 세계에 은유할 수 있지만, 그렇다고 현실 세계를 모방하는 것은 아니다. 객제지향을 현실 세계의 추상화라고 표현하는 것은 잘못됐다는 것이다.
실제 객체지향은 현실 세계와 다른 양상을 띤다. 그 의미는 비슷하더라도 현실을 모방한다는 것은 오해일 뿐이다.
의인화
소프트웨어 세계의 객체는 능동적으로 변한다. 초능력을 가지는 것처럼 새로운 능력을 가질 수도 있고, 또 다른 존재가 될 수도 있다. 어쨌든 현실 세계의 물체가 소프트웨어 세계에서는 전지전능한 존재가 되는 것. 이것을 의인화라고 부를 수 있다.
그러므로 모방한 것이 아닌, 현실의 모습을 조금 참조할 뿐, 새로운 세계를 창조한다.
'객체지향의 사실과 오해' 카테고리의 다른 글
[객체지향의 사실과 오해] 3. 타입과 추상화 (0) | 2023.08.03 |
---|---|
[객체지향의 사실과 오해] 1. 협력하는 객체들의 공동체 (0) | 2023.07.27 |