2장에서는 '이상한 나라의 앨리스'에 관련된 책의 일화를 소개하면서, 객체가 가져야 하는 책임과, 행동에 대해서 자세하게 설명한다.
지식을 추상화, 추상화한 지식을 캡슐화 하는 것, 객체를 발견하고 창조하는 것은 지식과 행동을 구조화 하는 문제이다.
- 추상화란 세상이 포함하고 있는 복잡성을 극복하기 위한 것
- 객체란 인간이 분명하기 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것이다.
- 객체의 특징
객체가 한 행동의 결과는 객체 상태에 의존적이다.
문을 통과하는 행동이 성공하려면 음료나 케이크를 먹는 행동이 선행되어야만 한다.
객체는 상태 변경과 무관하게 유일한 존재로 식별 가능하다.
객체는 상태를 가지며 상태는 변경 가능하다.
객체의 상태를 변경시키는 것은 객체의 행동이다.
public class Alice {
private int height;
private String location;
private Beverage beverage;
public Alice(int height, String location) {
this.height = height;
this.location = location;
}
public void drinkBeverage(Beverage beverage, double quantity) {
this.beverage = beverage;
beverage.drunken(quantity);
this.height = 40;
this.beverage = null;
}
public void throughDoor(Door door) {
String result = door.validateHeight(this.height);
if (result.equals("통과")) {
this.location = "아름다운 정원";
return;
}
this.location = "집";
}
}
drinkBeverage() 메서드를 호출함으로써 자신의 키를 40으로 줄인다.
자신의 상태인 height는 자신의 행동에 의해서 결정되었다.
자신의 상태를 가지고 문을 통과할 수 있는지 Door 객체에게 요청한다.
- 그럼 Door 객체는 앨리스의 키를 가지고 지나갈 수 있는지 없는지 판단하고 결과를 알려준다.
- 결과에 따라 앨리스의 위치는 "아름다운 정원" or "집"이 될것이다.
어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존하는 것이다.(문을 통과할 수 있었던 이유는 키가 작아지는 어떠한 행동을 해서)
상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측할 수 있다.
상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요한 개념이다.
앨리스가 현재 음료를 들고 있는 상태인지를 표현하고 싶다면, 어떻게 할 것인가??
가장 간단하고 직관적인 방법은 앨리스의 상태 일부를 음료라는 객체를 이용해 표현하는 것이다.
public class Alice {
private int height;
private String location;
private Beverage beverage;
public Alice(int height, String location) {
this.height = height;
this.location = location;
}
public void drinkBeverage(Beverage beverage, double quantity) {
this.beverage = beverage;
beverage.drunken(quantity);
this.height = 40;
this.beverage = null;
}
}
Alice를 들여다보자. drinkBeverage()메서드를 호출하면 이미 테이블에 놓여져 있는 (세상에 나와있는) Beverage 객체를 자신의 상태로 소유하게 된다. 그리고 다 마신 음료는 다시 버린다. (null)
public class Beverage {
private double quantity = 0.5;
public void drunken(double quantity) {
this.quantity -= quantity;
}
}
그 후 음료를 얼마나 마셨는지 알려주면 Beverage 객체는 앨리스가 마신양을 기준으로 자신의 상태를 줄인다.
모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.
일반적으로 프로퍼티는 변경되지 않고 고정 되기 때문에 '정적'이다. 하지만 프로퍼티의 값은 흐름에 따라 변경되기 때문에 동적이다.
앨리스의 키는 음료를 마시면 작아진다. 작아지면 문을 통과할 수 있기 때문에 위치가 정원으로 바뀐다.
앨리스가 문을 통과하는 행동은 앨리스의 위치를 변화시키는 부수 효과를 초래한다.
public void drinkBeverage(Beverage beverage, double quantity) {
this.beverage = beverage;
beverage.drunken(quantity);
this.height = 40;
this.beverage = null;
}
public void throughDoor(Door door) {
String result = door.validateHeight(this.height);
if (result.equals("통과")) {
this.location = "아름다운 정원";
return;
}
this.location = "집";
}
위의 코드예제에서 앨리스는 음료를 마심으로 써 자신의 원래 키가 130 -> 40으로 줄어들었다.
앨리스의 height 프로퍼티는 정적이다. 이것은 앨리스라는 객체를 표현하는 상태이며 정적
이다.
하지만 height를 표현하는 값
은 130에서 -> 40으로 줄어들었다.
음료를 마신다는 행위를 함으로써 프로퍼티를 표현하는 값은 동적
으로 변하였다. 그리고 문을 통과 했기 때문에 Side Effect
로 인해 location의 값도 변경되었다.
- 객체의 행동은 상태에 따라 영향을 받으면서, 현재 상태를 변경시킨다. 예)문을 통과 -> 앨리스의 키가 적절치 못함 -> 음료를 마심 -> 앨리스의 키가 변함.
- 객체의 행동은 객체 자신의 상태 변경과 행동 내에서 협력하는 다른 객체에 대한 메시지 전송이다.
public class Beverage {
private double quantity = 0.5;
public void drunken(double quantity) {
this.quantity -= quantity;
}
}
음료의 양을 줄이는 것은 음료 자신이어야 한다. 따라서 앨리스는 직접적으로 음료의 상태를 변경할 수 없기 때문에 음료에게 자신이 음료를 마셨는 메시지를 전달할 수 있을 뿐이다. 값이 같은지에 대한 여부는 상태가 같은지를 이용해 판단한다.(Object의 equals())
값의 상태가 같으면 두 인스턴스는 동일한 것으로 판단하고 상태가 다르면 두 인스턴스는 다른 것으로 판단한다.
이처럼 상태를 이용해 두 값이 같은지 판단할수 있는 성질을 동등성이라고 한다.
값은 변하지 않는 양을 모델링한다. 흔히 값의 상태는 변하지 않기 때문에 불변 상태를 가진다고 말한다.
객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다. 따라서 객체는 가변 상태를 가진다고 말한다.
객체 역시 사람과 유사하게 상태와 무관하게 두 객체를 동일하거나 다르다고 판단할 수 있는 프로퍼티를 가진다.
두 객체의 상태가 다르더라도 식별자(Object.hashCode()
)가 같다면 두 객체를 같은 객체로 판단할 수있다.
어린시절의 나
의 상태는 현재의 나
보다 키가 작고 몸무게도 덜 나가지만 나는 어린시절의 나와 현재의 나는 같은 객체이다.
이처럼 어린 시절의 나와 현재의 나를 표현할 수 있는 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성이라고 한다.
객체의 동일성은 상태를 이용해서 식별할 수 없다 -> 객체는 가변 상태이기 때문에.
따라서 상태가 가변적인 두 객체의 동일성을 판단하기 위해서는 상태 변경에 독립적인 별도의 식별자를 이용할 수 밖에 없다.
객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체지향 설계는 애플리케이션에 필요한 협력을 먼저 생각하고, 협력에 참여하는 데 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 수행된다.
따라서 먼저 객체의 행동을 결정하고, 그 후에 행동에 적절한 상태를 선택하게 된다.
협력안에서 객체의 행동은 결국 객체가 협력에 참여하면서 어떤 책임을 완수해야 하는것을 의미한다.
어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 한다
'북 스터디 > 객체지향의 사실과 오해' 카테고리의 다른 글
[Book] 6.객체 지도 (0) | 2024.06.20 |
---|---|
[Book] 5.책임과 메시지 (0) | 2024.06.20 |
[Book] 4.역할, 책임, 협력 (1) | 2024.06.13 |
[Book] 3. 타입과 추상화 (0) | 2024.06.13 |
[Book] 1장. 협력하는 객체들의 공동체 (0) | 2024.06.07 |