행동이 상태를 결정한다. 즉, 객체지향을 데이터가 아니라, 행동(책임) 중심으로 설계하자는 방식 이다.
📍 협력 안에서 객체의 행동은 결국 객체가 협력에 참여하면서 완수해야하는 책임을 의미한다. 따라서 "어떤 책임이 필요한가"를 결정하는 과정이 전체 설계를 주도해야 한다.
이 객체는 무슨 책임을 가져야 할까? → 객체는 책임을 가진다
이 책임을 어떻게 수행할까? → 행동이 먼저, 상태는 나중
누구에게 메시지를 보내서 협력할까? → 객체는 다른 객체와 협력한다
❌ 잘못된 방식 (데이터 중심)
class Order {
String orderId;
String status;
LocalDate orderDate;
List<Item> items;
// 상태만 가득, 행동은 없음
}
→ 이건 그냥 데이터 덩어리 (절차지향과 다를 게 없음)
✅ 책임 주도 방식
class Order {
void addItem(Item item);
void cancel();
Money calculateTotal();
}
→ “주문은 무엇을 할 수 있지?”로 시작
→ 그 다음 “이 행동을 하려면 어떤 정보가 필요하지?”로 상태를 정함
설계가 유연하고 확장 가능
객체는 자기 역할만 신경
협력이 자연스럽고, 테스트하기도 쉬움
복잡한 현실을 단순한 모델로 표현하는 것.
본질적인 것만 남기고, 불필요한 세부 사항은 감춘다.
📍 ab- : ~로부터 떨어져; trahere : 끌어당기다, 끌어내다 (to draw)
→ “복잡한 것에서 중요한 것을 끌어낸다”는 의미!
→ 즉, 중요한 특성만 남기고 나머지는 제거한다
"현상은 복잡하다. 법칙은 단순하다.버릴게 무엇인지 알아내라."
— 리처드 파인만
훌륭한 추상화는 목적에 부합하는 것이다.
객체가 제공하는 행위(인터페이스)만 드러내고, 내부 구현(상태, 알고리즘)은 숨긴다. 이것은 곧 캡슐화와도 연결된다.
📌 참고
📖 : 객체지향의 사실과 오해 - 역할, 책임, 협력 관점에서 본 객체지향