※ 제가 책 내용을 이해하기 위한 정리와 함께 개인 주관이 들어가 있습니다 :)
1. 객체지향과 인지능력
객체 = 인간이 분명하게 인지하고 구별 할 수 있는 물리적인, 개념적 중계
객체지향 세계 != 현실세계
2. 객체, 그리고 이상한 나라
2-1. 행동과 상태
앨리스의 행동에 따라 상태가 변한다
상태를 결정하는 것 > 행동
행동의 결과를 결정하는 것 > 상태
=> 행동의 결과는 상태에 의존적이다.
행동의 순서도 중요하다 : 순서가 올바라야 목적을 달성할 수 있다.
2-2. 앨리스의 행동과 상태
- 앨리스는 상태를 갖는다. 상태는 변경가능하다.
- 앨리스의 상태를 변경 시키는 것은 앨리스의 행동이다
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술가능하다.
- 행동의 순서가 결과에 영향을 미친다.
- 앨리스는 어떤 상태여도 식별가능하다.
3. 객체 그리고 소프트웨어 나라
3-1. 상태(state)
어떤 행동의 결과는 과거에 어떤 행동을 했는가? (의존적이다)
행동의 과정과 결과를 판단하기 위함
[ hard ] : 이전 행동의 이력을 모두 합하여 현재 다음행동이 가능한지 판단
[ easy ] : 현재 상태를 보고 다음 행동 여부 판단이 훨씬 간단하다
현재 기반 행동 방식 이해가능
숫자, 문자열, 양 -> 객체 X 객체의 특성 O
객체의 상태 : 모든 멤버 변수
- 객체의 프로퍼티 (property) : 상태를 구성하는 모든 요소 : 정적이다.
- 프로퍼티 값 (property value) : 행동의 결과로 상태 요소 변경 : 동적이다.
프로퍼티의 종류
- 링크(link) : 객체와 객체사이 의미있는 연결
- link 통해서만 메세지 주고 받기가 가능하다 - 속성(attribute) : 링크와 달리 객체를 구성하는 단순 값
객체의 프로퍼티와 프로퍼티 값
public class Example{
private String name;
public Example(String param){
this.name = param
}
}
여기서 프로퍼티는 java의 멤버변수인 name을 의미하고
프로퍼티 값은 멤버변수인 name에 들어가는 계속해서 변하는 값을 의미하는 것 같다.
위 코드에서는 Example 생성자에서 인자로 들어온 param이 name의 프로퍼티 값이 된다.
링크 프로퍼티와 속성 프로퍼티
class Champion{
private String name;
private Ability ability;
}
class Ability{
private String skill;
}
이렇게 주어져 있을 때.
Champion 객체의 name은 속성 프로퍼티
Champion 객체의 Ability는 링크 프로퍼티를 의미 하는 것 같다.
링크 프로퍼티는 reference object를 말하는 것 같다.
3-2. 행동(behavior)
= 상태를 변경시킨다.
= 행동이 부수효과(side effect)를 초래한다.
3-2-1. 상태와 행동
- 객체의 행동은 상태에 영향 받는다. -> 상호작용이 현재 상태에 어떤 방식으로 의존하는가
- 객체의 행동은 상태를 변경시킨다. -> 상호작용이 어떻게 현재 상태를 변경시키는가
3-2-2. 협력과 행동
상호작용이란?
= 다른 객체와의 협력
= 다른 객체에 요청을 보내기 (메세지 따라 행동 -> 자신의 상태 변경)
= 객체의 행동
= 다른 객체의 상태를 변경하는 것도 가능하다.
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
3-2-3. 상태 캡슐화
캡슐화의 역할
- 감추기 : private member 변수를 의미하는 듯 (상태)
- 노출하기 : public으로 정의한 메소드를 의미하는 듯 (행동) - 다른객체에 접근 할 수 있는 유일한 방법
상태의 변경 여부는 그객체의 자율에 맞긴다
캡슐화 > 자율성 향상 > 지능 향상 > 협력을 유연하고 간결하게
3-3. 식별자(identity)
객체 = 인간의 인지 능력을 이용해 식별 가능한 경계를 가진 모든 사물
식별자란? : 객체를 구분 가능한 특정 property
3-3-1. 값(value)
- 식별자가 없다
- 변하지 않는 값을 모델링
- 불변상태 (immutable state) > 불변하니까 필요하지 않다.
- 상태가 같은지로 판단한다.
- 동등성 (equality) : 상태를 이용해 두 값이 같은지 판단가능
== 으로 비교해서 같은게 value인 것 같다!
3-3-2. 객체(object)
- 식별자가 있다
- 시간에 따라 변경되는 상태를 포함한다
- 가변상태 (mutable state)
- 두 객체의 상태가 모두 같아도 두 객체는 다르다 : 식별자가 필요한 이유
- 동일성 (identical) : 식별자 기반으로 객체가 같은지 판단가능
- 식별자가 상태에 독립적이다.
.equal() 으로 비교해서 같은게 object인 것 같다!
만약 상태로 객체를 구분할 때
행동에 따라 상태가 변하면 그건 다른 객체일 것.
객체 (object) | 값 객체 (value object) |
= 참조 객체 (reference object) |
= 식별자를 가지지 않는 값 |
- 객체는 상태를 가지며 상태는 변경 가능하다.
- 객체의 상태를 변경시키는 것은 객체의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 실행 결과에 영향을 미친다.
- 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
4. 기계로서의 객체
객체 상태 조회 | 객체 상태 변경 |
쿼리 (query) | 명령 (command) |
기계 버튼
버튼 : 상태조회 / 변경 = 객체 행동 유발 위해 메시지 전송
사용자는 버튼으로 객체 접근 = 인터페이스
5. 행동이 상태를 결정한다.
- 선 상태 > 후 행동 (bad)
- 상태가 공용 인터페이스 그대로 노출 가능성 ↑
- 객체가 협력자 X 고립된 섬 O
- 객체 재 사용성 저하
- 선 행동 > 후 상태 (good)
- 어떤 행동 - 어떤 객체에 적합 (적합성 결정)
- 객체의 행동 - 협력에서 완수해야하는 책임 > 책임-주도 설계 : Responseibility-Driven Design (RDD)
'선 상태 > 후 행동'의 의미
ㄱ. 공용 인터페이스 그대로 노출가능성이 높아진다
멤버 변수를 public으로 놓았을 때를 이야기 하는거 같다.
이 경우 다른 객체에서 멤버변수에 접근해 다른 값으로 그냥 할당할 수 있다.
즉, 멤버변수의 값을 다른 객체에서 바꿀 수 있는 것은 다른 객체가 외부 객체의 상태를 바꿀 수 있다는 말이 된다.
그러다보면, public으로 객체의 상태를 변화하는거에 익숙한 메소드, 인터페이스를 만들게 되어,
상태의 노출이 심해지는 사태를 가리키고자 함축한 한 줄인 것 같다.
ㄴ. 객체가 고립된 섬이 된다
상태만 넣어두면 슈퍼객체가 된다!!
객체 지향을 따르면 여러 객체가 나눠가져야 하는 상태를 한 객체에 몰아넣는다!!
public class Alice{
int age;
}
public class Juice{
int amount;
}
원래는 Alice와 Juice가 분리되어, Alice가 Juice를 마시면, method를 이용해서 Juice의 상태 값을 바꾸는게 올바른 설계라면
public class Alice{
int age;
int juiceAmout;
}
Alice 객체 안에 juice의 양을 적어두는 설계를 이야기 하는 것 같다!!
찬인 ) 앨리스의 어깨? 팔?에 주스 달려있는거 같은 느낌인데??ㅋㅋㅋㅋ
6. 은유와 객체
6-1. 통념
'객체 지향이란 현실 세계의 모방'
현실세계의 추상화 : 자신이 원하는 특성만 취한다.
현실을 간추리고 요약하여 모방한다.
6-2. 의인화 - anthropomorphism
SW 객체 : 추가적인 능력! 현실보다 더 많은 일 가능
6-3. 은유 - metaphor
현실 객체 특징 ⊂ SW 객체 특징
프로그램 객체는 현실 객체의 은유이다.
- 표현적 차이 (representation gab)
- 의미적 차이 (senmantic gab)
차이 = SW 생각하는 모습, 실제 SW 표현의 차이
은유 관계의 실체 객체이름을 SW 객체 이름으로 사용하라 > 표현적 차이 ↓ > 이해 good > 유지보수 good
깔끔하게 현실세계 무시하라! = 나만의 새로운 SW 세계 창조하기
의인화랑 은유랑 왜 분리한건지 혼돈이었는데
결국은 같은 말을 하고싶었던거겠지 하고 수긍했다ㅋㅋ
'Dev Book Review' 카테고리의 다른 글
Redis 운영 관리 (1) | 2021.04.24 |
---|---|
[서평] Do it 지옥에서 온 문서관리자 깃&깃허브 입문 (0) | 2019.12.30 |
[객체지향의 사실과 오해] 1장 : 협력하는 객체들의 공동체 (0) | 2019.10.14 |