객체지향 패러다임의 핵심은 자율적인(Automonous) 객체들의 협력
📍 Automonous : 자율적인, 독립적인; autos : 자신(self); nomos : 법칙, 질서
즉 "자율적인 객체들이 서로 협력하여 문제를 해결하는 구조"를 말한다.
객체는 자신의 상태를 관리하며 공동의 목표를 달성하기 위해 메세지를 주고받으며 다른 객체와 협력한다.
💡객체지향의 주요 특징 (OOP 4대 특성)
| 특성 | 설명 | 키워드 |
|---|---|---|
| 캡슐화 | 중요한 것만 표현하고, 나머지는 감춤 | 본질만 단순화 |
| 추상화 | 상태(데이터)를 감추고, 행동(메서드)으로 접근 | 정보 은닉 |
| 상속 | 기존 타입의 특징을 물려받음 | 코드 재사용 |
| 다형성 | 같은 메세지를 다른 방식으로 처리 | 확장 유연성 |
상태(state)·행동(behavior)·식별자(identity)를 캡슐화한 것, 즉 엔티티(Entity) 혹은 참조 객체(Reference Object)를 말한다.
객체지향에서 “객체가 같다는 게 무엇을 의미하느냐”가 매우 중요하다.
객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다.
이를 "객체는 가변상태(mutable state)를 가진다."라고 말한다.
그럼 “두 객체가 같은가?”를 어떻게 판단할까?
엔티티(참조 객체) vs 값 객체 구분에서 → 비교 기준이 다르기 때문에 동등성 개념이 중요!
/** 엔티티: 식별자(id)가 객체 정체성을 나타낸다 */
class User {
private final String id; // 식별자
private String name;
// equals / hashCode — ID만 사용
@Override
public boolean equals(Object o) {
return o instanceof User u && id.equals(u.id);
}
@Override
public int hashCode() {
return id.hashCode();
}
}
/** 값 객체: 불변(immutable)하고 값 비교 */
class Money {
private final int amount;
private final String currency;
// equals / hashCode — 값 비교
@Override
public boolean equals(Object o) {
return o instanceof Money m && amount == m.amount && currency.equals(m.currency);
}
@Override
public int hashCode() {
return Objects.hash(amount, currency);
}
}
📍 포인트 : 같은 객체를 판단하는 비교 기준
- 엔티티는 누구냐가 중요 → ID 기반 비교
- 값 객체는 무엇이냐가 중요 → 상태 전체 기반 비교
Equality란?
참조 동일성(==) : 메모리 주소가 같음 → 같은 인스턴스
의미적 동등성(equals) : 객체가 의미적으로 같음 → 개발자가 정의
equals()와 hashCode() 계약
상태를 알면 과거에 어떤 행동을 했었는지 모르더라도 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.
객체는 상태를 외부로 노출시키지 않고, 행동을 노출시키고, 행동의 결과로 스스로의 상태를 변경한다. 이것은 객체의 자율성을 높이고, 객체간의 협력을 유연하고 간결하게 한다.
객체의 상태를 구성하는 모든 특징의 집합. 정적 메타정보이며 두 가지로 나뉜다.
속성(Attribute) : 단순 값으로 표현되는 특징 (예: 이름, 금액)
링크(Link) : 다른 객체를 참조하는 포인터 → 연관관계의 인스턴스 (예: 주문 → 고객)
📌 참고
📖 : 객체지향의 사실과 오해 - 역할, 책임, 협력 관점에서 본 객체지향