Final vs immutable in Java: 동일하지 않다
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;
}
}
이와 같은 클래스는 변경자를 노출하지 않으며, 생성 시 상태가 고정됩니다.
실제 불변성을 구현하는 방법
- 필드를
private및final로 선언합니다. - setter 를 포함하지 않습니다.
- 가변 데이터를 노출해야 한다면 방어적 복사(defensive copy)나 불변 컬렉션(예: Java 10+의
List.copyOf)을 반환합니다.
권장 조치
가변 List 를 반환하는 API를 검토하십시오. 메서드를 수정해 불변 컬렉션이나 복사본을 반환하도록 하고, 소비자가 리스트를 변경할 수 없음을 검증하는 테스트를 추가하세요. 이 조정을 통해 코드 가독성, 안전성 및 운영 시 예기치 않은 동작을 줄일 수 있습니다.