본문 바로가기

Dev Book Review

[객체지향의 사실과 오해] 2장 : 이상한 나라의 객체

※ 제가 책 내용을 이해하기 위한 정리와 함께 개인 주관이 들어가 있습니다 :) 

1. 객체지향과 인지능력

객체 = 인간이 분명하게 인지하고 구별 할 수 있는 물리적인, 개념적 중계

객체지향 세계 != 현실세계

 

2. 객체, 그리고 이상한 나라

2-1. 행동과 상태

앨리스의 행동에 따라 상태가 변한다

상태를 결정하는 것 > 행동
행동의 결과를 결정하는 것 > 상태

 

=> 행동의 결과는 상태에 의존적이다.

행동의 순서도 중요하다 : 순서가 올바라야 목적을 달성할 수 있다.

 

2-2. 앨리스의 행동과 상태

  1. 앨리스는 상태를 갖는다. 상태는 변경가능하다.
  2. 앨리스의 상태를 변경 시키는 것은 앨리스의 행동이다
    • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술가능하다.
    • 행동의 순서가 결과에 영향을 미친다.
  3. 앨리스는 어떤 상태여도 식별가능하다.

 

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. 협력과 행동

상호작용이란?

= 다른 객체와의 협력

= 다른 객체에 요청을 보내기 (메세지 따라 행동 -> 자신의 상태 변경)
= 객체의 행동
= 다른 객체의 상태를 변경하는 것도 가능하다.

  1. 객체 자신의 상태 변경
  2. 행동 내에서 협력하는 다른 객체에 대한 메시지 전송

3-2-3. 상태 캡슐화

캡슐화의 역할

  1. 감추기 : private member 변수를 의미하는 듯 (상태)
  2. 노출하기 : 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)
= 엔티티 (entity)
= 식별자를 지닌 객체

= 식별자를 가지지 않는 값
  1. 객체는 상태를 가지며 상태는 변경 가능하다.
  2. 객체의 상태를 변경시키는 것은 객체의 행동이다.
    • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
    • 행동의 순서가 실행 결과에 영향을 미친다.
  3. 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.

 

4. 기계로서의 객체

객체 상태 조회 객체 상태 변경
쿼리 (query) 명령 (command)

 

기계 버튼

버튼 : 상태조회 / 변경 = 객체 행동 유발 위해 메시지 전송

사용자는 버튼으로 객체 접근 = 인터페이스

 

5. 행동이 상태를 결정한다.

  1. 선 상태 > 후 행동 (bad)
    • 상태가 공용 인터페이스 그대로 노출 가능성 ↑
    • 객체가 협력자 X 고립된 섬 O
    • 객체 재 사용성 저하
  2. 선 행동 > 후 상태 (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 객체 특징

프로그램 객체는 현실 객체의 은유이다.

  1. 표현적 차이 (representation gab)
  2. 의미적 차이 (senmantic gab)

차이 = SW 생각하는 모습, 실제 SW 표현의 차이

은유 관계의 실체 객체이름을 SW 객체 이름으로 사용하라 > 표현적 차이 ↓ > 이해 good > 유지보수 good

 

깔끔하게 현실세계 무시하라! = 나만의 새로운 SW 세계 창조하기

 

의인화랑 은유랑 왜 분리한건지 혼돈이었는데

결국은 같은 말을 하고싶었던거겠지 하고 수긍했다ㅋㅋ