종종 무시되는 작은 객체들을 '값 객체'로 구현하면 풍부한 행동을 얻을 수 있다.
- 마틴 파울러
값 객체란?
객체지향 프로그래밍에서는 다양한 것들을 객체로 만들 수 있다. 객체로 만들 수 있는 것 중에 어떤 "값"도 포함된다. (ex. 잔고, 색상, 좌표 등)
자바가 제공하는 원시 데이터 타입을 사용해 개발할 수 있지만, 시스템 특유의 값을 정의해야 할 때가 분명 존재한다. 이때 정의하는 것이 값 객체이다.
값 객체의 특징
- 불변성
- 교환
- 등가성
1. 불변성
값 객체의 상태를 수정할 때는 새로운 값을 대입한다. 이때 변하는 것은 값의 상태지, 값 자체가 수정되는 것은 아니다.
예를 들어 Member 객체의 name의 상태가 Jiyoon에서 Yoonji로 바뀌었다. 이때 바뀐 것은 name이지, Member 자체가 아니다. 쉽게 말하면 개명을 했다고 해서 사람이 바뀐 게 아니다.
2. 교환
값 객체가 불변성을 가진다 해도 수정은 가능하다. 이때는 새로운 객체를 생성하는 대입문을 사용하여 값을 수정한다.
Member member = new Member("jiyoon");
member = new Member("Yoonji");
3. 등가성
값 객체를 비교하는 경우 값의 상태를 꺼내 equals 메서드로 비교한다. 예시는 아래와 같다.
색상을 표현하는 클래스
class Color {
private int red;
private int green;
private int blue;
public Color(int red, int green, int blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
}
이제 두 개의 빨간색 값 객체를 만들고 비교해 보자.
public class Main {
public static void main(String[] args) {
Color red1 = new Color(255, 0, 0)
Color red2 = new Color(255, 0, 0)
if(red1 == red2) {
System.out.pringln("같음");
} else {
System.out.pringln("다름");
}
}
}
이 코드는 "다름"을 출력한다.
일반적인 경우
그 대상이 어떤 이름을 가지고 있든 간에 같다고 생각한다. "빨간" 사과와 "빨간" 스포츠카, "빨간" 동그라미는 모두 같은 "빨간"을 의미한다.
값 객체의 경우
값 객체가 생성되는 순간 독립된 객체가 된다. 값 객체가 같은 값을 가지고 있다 하더라도 다른 객체이기 때문에 같지 않다. 이러한 개념을 참조객체라고 한다.
Color red1 = new Color(255, 0, 0)
Color red2 = new Color(255, 0, 0)
if(red1.equals(red2)) {
System.out.pringln("같음");
} else {
System.out.pringln("다름");
}
이 코드는 "같음"을 출력한다.
동일 vs 동등
동일 (==)
- 객체가 참조하는 것, 다시 말해 대상이 같다는 것을 의미
동등 (equals)
- 객체가 참조하는 대상의 속성 값 혹은 동등하게 하는 조건이 같음을 의미
값 객체로 만드는 기준
단순히 도메인 모델로 정의되면 값 객체로 정의한다. 하지만 그렇지 않은 경우가 문제다.
예를 들어 사람의 성과 이름을 하나의 값 객체로 볼 것인지, 아니면 두 개의 String으로 볼 것인지는 사람마다 생각이 다르다. 이때 생각해야 할 게 행동이다. 값 객체는 행동이 정의된다.
값 객체는 단순히 데이터만 담는 구조체가 아니다. 값 객체는 데이터와 더불어 그 데이터에 대한 행동을 한 곳에 모아움으로써 자신만의 규칙을 갖는 도메인 객체가 된다.
값 객체의 목적은 시스템 고유의 값을 만드는 데에 있다. 원시 데이터 타입의 빈약적인 표현력을 보충하기 위해 사용한다.
값 객체를 이해하고 나니까 도메인 주도 설계가 궁금해졌다... 하지만 아직은 건드리지 않는 걸로..
출처
https://www.youtube.com/results?search_query=%EA%B0%92%EA%B0%9D%EC%B2%B4
'Dev > Java' 카테고리의 다른 글
[Java] Value Object와 Entity에 대한 소신 정리 (0) | 2024.05.19 |
---|---|
[Java] Random 클래스를 사용하면 안 되는 이유 (0) | 2024.05.17 |
[Java] 필드 동기화로 인한 동시성 문제 해결하기 (by. ThreadLocal) (0) | 2024.05.03 |
[Java] Web server failed to start. Port 5000 was already in use. (MacOS) (1) | 2024.01.24 |
[Java] Checked Exception vs. UnChecked Exception (1) | 2023.09.12 |