https://book.naver.com/bookdb/book_detail.nhn?bid=9145968
Spring을 공부하면 읽어봐야 한다는 책 두 권을 추천 받았습니다.
그 중 하나인 객체지향의 사실과 오해를 먼저 읽어보려고 합니다.
한 목차씩 보면서 감상평..?을 적어보며 정리해보자 합니다.
▣ 01장: 협력하는 객체들의 공동체
협력 공동체의 일원으로서 객체는 두가지 덕목을 갖춰야 하며 두 덕목 사이에서 균형을 유지해야 한다.
1. 객체는 충분히 '협력적'이여야 한다.
즉, 외부의 도움을 무시한 채 모든 일들으 스스로 처리하려 하면 "내부적인 복잡도"에 의해 자멸한다.
2. 객체는 충분히 '자율적'이여야 한다.
즉, 객체는 다른 객체가 '무엇(what)'을 수행하는지는 알 수 있지만 '어떻게(how)' 수행하는지에 대해서는 알 수 없다.
과거 전통적인 개발 방법과 다른 점으로는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 놓음으로써 객체의 자율성을 보장한다.
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체, 객체를 이용해 시스템을 분할하는 방법
- 자율적인 객체는 상태와 행위를 함께 지닌다. 자기 자신을 책임지는 객체
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력
- 객체는 다른 객체와 협력하기 위해 메시지를 전송. 메시지를 수신하는 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택
▣ 02장: 이상한 나라의 객체
- 객체지향과 인지 능력
객체지향 패러다임의 목적은 현실 세계를 마방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다.
즉, 현실 세계의 객체들과 유사하지만 전혀 다른 모습으로 보이는 것이 일반적이다.
실행 중인 객체지향 어플리케이션의 겉은 현실 세계와 유사해 보이지만, 본질적으로는 매우 이질적인 모습을 지닌 세계를 보게 된다.
- 객체, 그리고 이상한 나라
이상한 나라의 앨리스 이야기에서 앨리스는 작은 문을 통과하기 위해 온갖 고초를 겪는다.
앨리스는 작은 문을 통과하기 위해 키의 변화에 초점을 맞추고 있다.
앨리스를 객체로 보면 앨리스 객체의 "상태"가 부채질을 하거나 음료를 마시거나 버섯을 먹거나 하는 등의 "행동"에 따라 변하게 된다.
또한, 변화된 "상태"에 따라 "행동"의 결과가 달라지기도 한다.
어떤 행동의 성공 여부는 이전에 어떤 행동들이 발생했는지에 영향을 받는다.
즉, 앨리스가 한 행동의 결과는 앨리스의 상태에 의존적이다.
요약을 해보면,
1. 앨리스는 상태를 가지며 상태는 변경이 가능
2. 앨리스의 상태를 변경시키는 것은 앨리스의 행동 (결과는 상태에 의존적, 행동의 순서가 결과에 영향을 미친다)
3. 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다.
- 객체, 그리고 소프트웨어 나라
하나의 개별적인 실체로 식별 가능한 물리적인 또는 개념적인 사물은 어떤 것이라도 "객체"가 될 수 있다.
객체의 다양한 특성을 설명하기 위해 객체를 "상태", "행동", "식별자" 를 지닌 실체로 보는 것이 가장 효과적이다.
1. 상태
객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐에 좌우된다.
상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측할 수 있다.
즉, 앨리스의 키와 문의 높이라는 두 가지 상태만 알면 문을 통과하는 행동의 결과를 쉽게 예측할 수 있다.
상태와 프로퍼티
앨리스가 문을 통과하면서 겪게 되는 소동 속에서 앨리스, 문, 앨리스의 키를 조정해주는 케이크, 부채, 버섯 모두 객체이다.
하지만, 세상의 모든 존재가 객체는 아니다. 앨리스의 "키", "위치", 음료와 케이크의 "양"은 객체가 아니다.
숫자, 문자열, 양, 속도, 시간, 날짜, 등 단순한 값들은 객체가 아니다.
이것들은 다른 객체의 상태를 표현하기 위해 사용된다.
결론적으로 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.
이때 객체의 상태를 구성하는 모든 특징을 통틀어 "객체의 프로퍼티"라고 한다.
일반적으로 프로퍼티는 "정적", 프로퍼티의 값은 시간의 흐름에 따라 변경되기 때문에 "동적"이다.
"앨리스가 음료를 들고 있다."라는 것을 어떻게 표현할까?
앨리스와 음료는 서로 다른 객체이다. 앨리스가 음료의 상태를 알고 있다,없다로 연결이 되어 있다고 할 수 있다.
이러한 객체와 객체 사이의 의미를 있는 연결을 "링크"라고 한다.
객체와 객체 사이에 링크가 존재해야만 요청을 송/수신할 수 있다.(즉, 메시지를 주고 받을 수 있다.)
이 책에서는 객체의 "상태"를 다음과 같이 정의하기로 한다.
상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
- 행동
상태와 행동
객체가 취하는 "행동"은 객체 자신의 "상태"를 변경시킨다.
객체의 행동에 의해 객체의 상태가 변경된다는 것은 행동이 side effect를 초래한다는 것을 의미한다.
1. 객체의 행동은 상태에 영향을 받는다.
2. 객체의 행동은 상태를 변경시킨다.
상태를 이용하면 이전의 행동들을 몰라도 복잡한 객체의 행동을 쉽게 이해할 수 있다.
예를 들어 앨리스의 키가 40센티미터 이하라면, 문을 통과할 수 있다. 처럼 간단하게 정의할 수 있다.
협력과 행동
어떤 객체도 섬이 아니다.
협력, 자신의 책임을 완수하기 위해 다른 객체들의 도움이 필요하고 도움을 줄 수도 있다는 것이다.
협력하는 객체들의 공동체
"행동"이란
외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동
객체는 행동을 통해 다른 객체와 협력하므로 행동은 외부에 가시적이여야 한다.
상태 캡슐화
"앨리스가 음료수를 마신다."는 행동을 현실과 객체지향 세계로 보면 현실 세계와 객체지향 세계의 객체 사이의 중요한 차이점이 있다.
현실에서는 객체가 "수동적일 수 있지만"
(음료는 수동적, 앨리스는 능동적, 음료를 마신다는 것은 앨리스가 주체가 된다.)
객체지향 세계에서는 객체가 "자신의 상태를 스스로 관리하는 자율적인 존재"이다.
(음료를 마신다라는 행동이 발생하면 음료가 스스로 자신의 상태를 변경한다.)
이것을 메시지로 표현하면
drinkBeverage()[메시지] >> 앨리스[객체] >> drunken(quantity)[메시지] >> 음료[객체]
메시지 이름에 집중을 하면 "음료를 마신다.", "마셨다"라는 메시지로
앨리스의 키가 줄어들거나 음료의 양이 줄어든다는 상태 변경을 예상할 수 있는가?
즉 객체의 상태 변경에 대해서는 외부에서 전혀 알지 못한다.
이것이 "캡슐화"가 의미하는 것이다.
객체는 상태를 캡슐 안에 감추고 외부로 노출하지 않는다. 객체가 노출하는 것은 "행동"뿐이며,
객체에 접근할 수 있는 방법 역시 "행동"뿐이다.
"캡슐화"하는 것은 결과적으로 객체의 자율성을 높인다.
자율적인 객체는 스스로 판단하고 스스로 결정한다.
그리고 협력에 참여하는 객체들의 지능이 높아질수록 협력은 유연하고 간결해진다.
- 기계로서의 객체
객체지향의 세계를 창조하는 개발자들의 주된 업무는 객체의 상태를 조회, 변경하는 것이다.
일반적으로 객체의 상태를 조회하는 작업을 쿼리(query), 객체의 상태를 변경하는 작업을 명령(command)라고 한다.
버트란드 마이어는 객체를 기계라는 실생활의 사물에 비유해서 설명한다.
기계를 분해하지 않는한 기계의 내부를 직접 볼 수 없다.
대신 사람은 기계의 외부에 노출되어 있는 버튼으로 기계와 상호작용할 수 있다.
(음료는 마신다, 케이크를 먹는다, 부채질한다.. 등등의 네모 버튼과 키,위치라는 둥근 버튼이 있다고 예를 들면)
사용자가 객체 기계의 버튼을 눌러 상태를 변경하거나 상태 조회를 요청하는 것은 객체의 행동을 유발하기 위해 메시지를 전송하는 것과 유사하다.
예를 들어 음료를 마신다를 누른다면 내부에서는 어떠한 작업들이 일어나는지 사용자는 모르게 기계(객체)가 스스로 결정한다.
이것은 전달된 메시지에 따라 스스로 판단하고 결정하는 자율적인 객체의 특성과 캡슐화라는 특성을 묘사할 수 있다.
또한 기계로 객체를 묘사하여 객체의 식별자를 효과적으로 설명할 수 있다.
예를 들어 똑같은 기능을 하는 기계가 2개가 있다고 생각하면(똑같은 아이폰이 2개) 두 기계 다 같은 상태에 같은 행동을 할 수 있는 기계이지만 두 기계는 구분된 별개의 객체로 인식한다.
객체를 기계로서 바라보는 관점은 상태, 행동, 식별자에 대한 시각적인 이미지를 제공하고 캡슐화와 메시지를 통한 협력 관계를 매우 효과적으로 설명할 수 있다.
- 행동이 상태를 결정한다
객체지향에 갓 입문한 사람들이 빠지기 쉬운 함정은 상태를 중심으로 객체를 바라보는 것이다.
즉, 객체에 필요한 상태가 무엇인지(앨리스의 키, 앨리스의 위치 등)를 결정하고 그 상태에 필요한 행동을 결정한다.
하지만 이러한 방식은 설계에 나쁜 영향을 끼친다.
첫쨰, 상태를 먼저 결정할 경우 캡슐화에 저해된다.
상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되버릴 확률이 높아진다.
둘째, 객체를 협력자가 아닌 고립된 섬으로 만든다.
상태를 먼저 고려하는 방식은 협력이라는 문맥에서 벗어난 채 객체를 설계하게 함으로써 자연스럽게 협력에 적합하지 못한 객체를 창조하게 된다.
셋째, 객체의 재사용성이 저하된다.
객체의 재사용성은 다양한 협력에 참여할 수 있는 능력에서 나온다. 하지만 상태에 초점을 맞춘 객체는 위에서와 마찬가지로 협력에 참여하기 어렵기 때문에 재사용성이 저하될 수밖에 없다.
즉, 객체는 다른 객체와 협력하기 위해 존재한다.
객체의 행동은 객체가 협력에 참여하는 유일한 방법이다. 따라서 객체가 적합한지를 결정하는 것은 그 객체의 상태가 아니라 행동이다.
행동을 결정한 후에야 행동에 필요한 정보가 무엇인지를 고려하여 이 과정에서 필요한 상태가 결정된다.
"행동이 상태를 결정한다."
협력이라는 문맥 안에서 객체의 행동을 생각하도록 도움으로써 응집도 높고 재사용 가능한 객체를 만들 수 있게 한다.
▣ 03장: 타입과 추상화
추상화를 통한 복잡성 극복
객체지향과 추상화
- 모두 트럼프일 뿐
- 그룹으로 나누어 단순화하기
- 개념
- 개념의 세 가지 관점
- 객체를 분류하기 위한 틀
- 분류는 추상화를 위한 도구다
타입
- 타입은 개념이다
- 데이터 타입
- 객체와 타입
- 행동이 우선이다
타입의 계층
- 트럼프 계층
- 일반화/특수화 관계
- 슈퍼타입과 서브타입
- 일반화는 추상화를 위한 도구다
정적 모델
- 타입의 목적
- 그래서 결국 타입은 추상화다
- 동적 모델과 정적 모델
- 클래스
▣ 04장: 역할, 책임, 협력
협력
- 요청하고 응답하며 협력하는 사람들
- 누가 파이를 훔쳤지?
- 재판 속의 협력
책임
- 책임의 분류
- 책임과 메시지
역할
- 책임의 집합이 의미하는 것
- 판사와 증인
- 역할이 답이다
- 협력의 추상화
- 대체 가능성
객체의 모양을 결정하는 협력
- 흔한 오류
- 협력을 따라 흐르는 객체의 책임
객체지향 설계 기법
- 책임-주도 설계
- 디자인 패턴
- 테스트-주도 개발