Final vs immutable in Java: 동일하지 않다

발행: (2025년 12월 27일 오후 01:30 GMT+9)
2 min read
원문: Dev.to

Source: Dev.to

핵심 개념

Final: 참조의 재할당을 차단하지만, 내용 자체는 차단하지 않습니다. 객체가 가변(mutable)이라면 계속 조작할 수 있습니다.

불변(Immutable): 객체는 생성된 이후에 상태가 변하지 않습니다. 변경자를(ex. setter) 노출하지 않으며, 컬렉션을 포함하고 있다면 외부에서 수정할 수 없도록 합니다.

예시

가변 컬렉션에 적용된 final

final List items = new ArrayList<>();
items.add("alpha"); // OK
// items = new ArrayList<>(); // Error: cannot assign a value to final variable

실제 불변 클래스

public final class UserId {
    private final String value;

    public UserId(String value) {
        this.value = value;
    }

    public String value() {
        return value;
    }
}

이와 같은 클래스는 변경자를 노출하지 않으며, 생성 시 상태가 고정됩니다.

실제 불변성을 구현하는 방법

  • 필드를 privatefinal 로 선언합니다.
  • setter 를 포함하지 않습니다.
  • 가변 데이터를 노출해야 한다면 방어적 복사(defensive copy)나 불변 컬렉션(예: Java 10+의 List.copyOf)을 반환합니다.

권장 조치

가변 List 를 반환하는 API를 검토하십시오. 메서드를 수정해 불변 컬렉션이나 복사본을 반환하도록 하고, 소비자가 리스트를 변경할 수 없음을 검증하는 테스트를 추가하세요. 이 조정을 통해 코드 가독성, 안전성 및 운영 시 예기치 않은 동작을 줄일 수 있습니다.

Back to Blog

관련 글

더 보기 »

내 TicketDesk 시스템

소개: 프로그래밍 입문 모듈을 위해 Java로 TicketDesk 시스템을 만들었습니다. 이 시스템은 다음을 수행할 수 있습니다: - 티켓 추적 - 로그인 정보 추적 - 역할 기반 인증 제공