1-1. Identifier Equality
- 클래스 내부에 식별자(id) 필드를 갖고 있다.
- 객체의 동등 여부를 id로 구별한다.
1-2. Structural Equality
- 클래스 내부의 필드(멤버)가 모두 같다면 두 객체는 같다.
2. Vo (Value Object) - 값 객체
- vo는 값으로서 쓰일 수 있는 객체이다. vo는 해당 객체의 주소 값이 달라도 값(Structural Equality, 구조적 동등성)이 같으면 동일하다고 생각할 수 있다.
- 만약 고유 번호(프로그래밍 세계에선 저장된 메모리 주소)가 서로 다른 50000원 짜리 지폐 2장이 있는 경우, 이 2장의 고유 번호는 서로 다르지만 50000원 이라는 값은 동일하다.
3. Entity
- Entity는 Id로 구분된다. 따라서 고유한 식별자가 존재한다.
- 대부분 가변적이다.
- 수명이 존재한다.
- 따라서 Entity는 Identifier Equality로 객체를 비교한다.
4. 수명의 관점으로 보는 vo와 Entity
Entity는 수명이 있다.
- 객체가 어떻게 변화했는지, 어떤 상태인지에 대한 기록들을 가진다.
Value Object는 수명이 없다.
- 쉽게 생성 및 삭제 가능
- 수명이 없기 때문에 언제든지, 값 객체를 생성하여 대체 가능
- vo는 독립적으로 존재할 수 없다.
- vo는 값을 표현한다. 이러한 값을 가지고 있는 entity의 문맥 안에서만 의미를 가진다.
5. 불변성
value Object는 불변(Immutable)이어야만 한다.
- value Object는 말 그대로 값 객체이다. 따라서 값을 변경할 때는 새로운 값 객체로 갈아 끼워주면 된다.
- value Object를 변형 시킨다면, 값 객체는 Life Cycle을 가지게 된다.
- 값 객체가 고유의 Life Cycle을 가지게 되면, 객체는 고유의 식별자를 가져야 하게 되고 이는 value object의 정의와 멀어지게 된다. → 따라서 vo는 불변적이어야 Life Cycle을 가지지 않게 되고, 이는 어느 상태의 순간 (값)이라는 것을 의미한다.- 어떤 객체를 불변으로 만들지 못하면, 그 객체는 vo로서도 사용 될 수 없다.
Entity는 대부분 가변(Mutable)이다.
- 특정 vo들을 필드로 가지는 entity가 있는 경우, 해당 entity의 Life Cycle의 따라서 vo들은 새로운 vo로 바뀌게(대체) 될 수 있다. 따라서 Entity는 대부분 가변적이다.