PHpullh
학습 라이브러리/Java/불변 객체 설계

JAVA · 객체지향

불변 객체 설계

불변 객체를 올바르게 설계하는 5가지 규칙을 배웁니다.

객체지향중급불변immutablefinal방어적복사

핵심 설명

불변 객체를 올바르게 설계하는 5가지 규칙을 배웁니다.

Java code

import java.util.*;

// 불변 클래스 설계 5규칙
public final class Money { // 1. final 클래스
    private final int amount;        // 2. final 필드
    private final String currency;
    private final List<String> tags; // 가변 객체 포함

    // 3. 생성자에서 방어적 복사
    public Money(int amount, String currency, List<String> tags) {
        this.amount = amount;
        this.currency = currency;
        this.tags = List.copyOf(tags); // 방어적 복사
    }

    // 4. getter만 제공 (setter 없음)
    public int amount() { return amount; }
    public String currency() { return currency; }

    // 5. 가변 객체는 방어적 복사로 반환
    public List<String> tags() {
        return Collections.unmodifiableList(tags);
    }

    // 값 변경 시 새 객체 반환
    public Money add(int value) {
        return new Money(this.amount + value, this.currency, this.tags);
    }

    // record로 더 간단하게
    // record Money(int amount, String currency, List<String> tags) {}
}

학습 팁

불변 객체는 스레드 안전하고, 캐싱이 가능하며, 부수 효과가 없습니다. 가능하면 record를 사용하세요.

주의할 점

가변 컬렉션을 필드에 직접 할당하면 외부에서 수정할 수 있습니다. List.copyOf()로 방어적 복사를 하세요.

자주 묻는 질문

불변 객체 설계란 무엇인가요?

불변 객체를 올바르게 설계하는 5가지 규칙을 배웁니다.

불변 객체 설계 학습 시 주의할 점은 무엇인가요?

가변 컬렉션을 필드에 직접 할당하면 외부에서 수정할 수 있습니다. List.copyOf() 로 방어적 복사를 하세요.