* 이 글은 책을 읽고 주관적인 생각과 함께 요약 정리한 글입니다.설명을 위한 글이 아니므로 내용이 정확하지 않을 수 있습니다.
제목 : 객체지향의 사실과 오해
저자 : 조영호
범위 : 02 이상한 나라의 객체
요약 정리
- 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
- 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.
- 숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓과 같은 단순한 값들은 객체가 아니다.
- 단순한 값들은 다른 객체의 상태를 표현하기 위해 사용한다.
- 객체의 상태를 구성하는 모든 특징을 객체의 프로퍼티라고 한다.
- 정적인 프로퍼티 사람이라면 키, 성별, 체력 등이 될 수 있고 변경되지 않고 고정되기 때문에 ‘정적’이다. (cf. key)
- 동적인 프로퍼티 값(value)은 시간이 흐름에 따라 변경되기 때문에 ‘동적’이다. (cf. value)
- 객체와 객체 사이의 의미 있는 연결을 링크라고 한다.
- 링크는 객체가 다른 객체를 참조할 수 있다는 것을 의미하며 일반적으로 다른 객체의 식별자를 알고 있는 것으로 표현한다.
- 객체를 구성하는 단순한 값은 속성(attribute)이라고 한다.
- 프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두 가지 종류의 조합으로 표현할 수 있다.
- ‘상태'는 특정 시점에 객체가 가지고 있는 정보의 집합이다.
- 객체지향의 기본 사상은 상태와 상태를 조작하기 위한 행동을 하나의 단위로 묶는 것이다.
- 객체는 스스로의 행동에 의해서만 상태가 변경되며 이를 객체의 자율성이라 한다. 다른 객체에게 협력하더라도 자신의 상태는 자신의 행동으로만 변경할 수 있다.
- 상태에 영향을 받아 행동을 하게되고 행동의 결과로 상태가 변경된다. 배가 고파서(상태) 밥을 먹고(행동) 밥을 먹어서 배가 부르다.(결과 - 상태의 변경)
- 목표가 있고 목표를 달성하기 위해 상태를 변경해야하고 상태를 변경하기위해 행동을하고 행동을 함으로써 상태가 변경되고 상태가 변경되어 목표를 달성하게 된다.
- 객체가 협력하는 유일한 방법은 다른 객체에게 요청을 보내는 것이다.
- 객체의 행동은 두 가지 관점의 부수효과를 명확히 서술해야 한다.
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
- 행동이란 외부의 메시지에 응답하기 위한 동작이다.
- 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달한다.
- 행동은 다른 객체와의 협력이므로 행동은 외부에 가시적이어야 한다.
- 반대로 상태의 변경은 외부에서 전혀 알지 못한다. 이를 캡슐화라고 한다.
- 식별자란 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것을 말한다.
- 값과 객체의 가장 큰 차이점은 식별자의 존재 여부다.
- 값의 상태는 변하지 않기 때문에 불변 상태라고 말한다.
- 객체는 시간에 따라 변경되는 상태를 포함하며 행동을 통해 상태를 변경한다. 따라서 가변 상태를 가진다. 타입이 같은 두 객체의 상태가 완전히 갖더라도 두 객체는 별개의 객체이다. (쌍둥이가 별개의 사람으로 여겨지듯이)
- 식별자를 가지고 두 객체가 같은지 판단하는 것을 동일성이라고 한다.
- 객체를 지칭하는 용어 → 참조 객체, 엔티티
- 개발자들의 주된 업무는 객체의 상태를 조회하고 객체의 상태를 변경하는 것이다.
- 상태를 조회하는 작업을 쿼리, 상태를 변경하는 작업을 명령(command)라고 한다.
- 훌륭한 객체는 행동에 초점을 맞춘다.
- 객체는 다른 객체와 협력하기 위해 존재한다.
- 객체가 적합한지를 결정하는 것은 그 객체의 상태가 아니라 행동이다.
- 객체지향 설계 순서
- 필요한 협력을 생각하고
- 협력에 필요한 행동을 생각하고
- 행동을 수행할 객체와 상태를 선택한다.
- 행동은 결국 협력하며 완수해야 하는 책임을 의미한다. 이를 책임-주도 설계 RDD 라고 부른다. 응집도 높고 재사용 가능한 객체를 만들 수 있게 한다.
- 객체는 현실을 모방하거나 추상화한 것이 아니다. 현실과 전혀 다른 새로운 세계를 창조하는 것이다.
- 현실을 무시하고 자유롭게 새로운 세계를 창조하길 바란다.
하고 싶은 말
- 링크가 어떻게 생겼는지 궁금하다.
- 동등성, 동일성에 대해 추가 학습이 필요하다.
- 파이썬에서 객체의 식별자는 어떻게 알 수 있는가?