
이 글은
객체지향의 사실과 오해 (조영호 지음)책 내용 일부를 정리한 글입니다.우아한테크코스 프리코스 피드백중 관련 있는 내용을 함께 정리했습니다.
상태와 행동부수 효과(side effect): 객체의 행동에 의해 객체의 상태가 변경된다.객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.
객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.
필드는 private class 필드로 구현한다. 객체의 상태를 외부에서 직접 접근하는 방식을 최소화한다.
class WinningLotto {
#lotto
#bonusNumber
constructor(lotto, bonusNumber) {
this.#lotto = lotto
this.#bonusNumber = bonusNumber
}
}
객체의 행동을 유발하는 것은 외부로 전달된 메시지지만 객체의 상태를 변경할지 여부는 객체 스스로 결정한다.
Lotto 클래스는 numbers를 상태 값으로 가진다. 그런데 이 객체는 로직에 대한 구현은 하나도 없고, numbers에 대한 getter 메서드만을 가진다.
class Lotto {
#numbers;
constructor(numbers) {
this.#numbers = numbers;
}
getNumbers() {
return this.#numbers;
}
}
class LottoGame {
play() {
const lotto = new Lotto(...);
// 숫자가 포함되어 있는지 확인한다.
lotto.getNumbers().contains(number)
// 당첨 번호와 몇 개가 일치하는지 확인한다.
lotto.getNumbers().stream()...
}
}
Lotto에서 데이터를 꺼내지(get) 말고 메시지를 던지도록 구조를 바꿔 데이터를 가지는 객체가 일하도록 한다.
class Lotto {
#numbers;
constructor(numbers) {
this.#numbers = numbers;
}
contains(number) {
// 숫자가 포함되어 있는지 확인한다.
return ...
}
matchCount(other) {
// 당첨 번호와 몇 개가 일치하는지 확인한다.
return ...
}
}
class LottoGame {
play() {
const lotto = new Lotto(...);
lotto.contains(number);
lotto.matchCount(...);
}
}
“행동이 상태를 결정한다.”
협력을 생각한다.행동을 생각한다.객체를 선택한다.아래는 우테코 프리코스 미션으로 내가 구현한 다리 건너기 게임의 구조도이다.
각각의 객체에서 필드는 상태, 메서드는 행동이며 객체 간 메시지를 주고받으며 협력한다. MVC 패턴으로 구조화하고자 했다.

기능 vs 구조요구사항 변경에 대비하기 위해서는 자주 변경되는 기능이 아닌 안정적인 구조를 중심으로 설계해야 한다.
객체의 구조에 집중하고 기능이 객체의 구조를 따르게 만든다. 시스템 기능은 더 작은 책임으로 분할되고 적절한 객체에게 분배되기 때문에 기능이 변경되더라도 객체 간의 구조는 그대로 유지된다.
구조: 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계기능: 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위도메인 모델도메인: 사용자가 프로그램을 사용하는 대상 분야도메인 모델: 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태유스케이스(Use Case)유스케이스: 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것기능을 명시(유스케이스)하고구조(도메인 모델)를 기반으로기능을 책임으로 변환한다.