객체지향 프로그램을 작성할 때 어떤 클래스가 필요한지 고민하지만 이건 객체지향의 본질과는 거리가 있다. 객체지향은 말 그대로 객체를 지향하는 것이다.
첫째로 어떤 객체가 필요한지 고민한다. 클래스는 객체의 공통적인 상태와 행동을 추상화한 것이다. 따라서 어떤 상태와 행동이 필요한지 결정한다.
둘째로 객체를 독립적인 존재가 아니라 협력하는 공동체의 일원으로 바라본다. 이것은 설계를 유연하고 확장 가능하게 만든다.
→ 훌륭한 협력이 훌륭한 객체를 만들고 훌륭한 객체가 훌륭한 클래스를 만든다.
2장을 읽으면서 가장 충격(?)받고 인상깊었던 코드는 Money라는 객체를 설계한 방식이다. 단순히 double형이나 bigDecimal을 필드로 사용할 수 있는데 Money라는 클래스로 분리하여 만든 방법이다. 간단하게 코드를 작성해보겠다.
public class Movie {
private BigDecimal money; // money를 객체로 분리한다.
...
}
public class Money {
// 이런식으로 반환할 수 있구나에서 충격
private static final Money ZERO = Money.wons(0);
private final BigDecimal amount;
public Money(BigDecimal amount) {
this.amount = amount;
}
// 외부에서 amount를 가져가 더하는게 아니라 메세지를 던지는 방법
public Money plus(Money amount) {
return new Money(this.amount.add(amount.amount));
}
...
}
객체
협력