본문 바로가기
Dev/Java

『Java』 객체의 불변성(Immutability)이란 무엇인가?

by 세대교체 2024. 10. 30.

객체의 불변성(Immutability)이란?

객체가 불변(immutable)하다는 것은 생성 후 객체의 상태가 변경되지 않는다는 뜻이다.

즉, 객체를 처음 만들었을 때의 상태를 끝까지 유지한다는 말이다.

 

 

불변성의 중요성

불변 객체는 여러 장점이 있다. 가장 큰 장점은 동기화 문제를 피할 수 있다는 것이다.

 

객체 상태가 바뀌지 않으므로 여러 스레드에서 동시에 접근해도 Thread-safe 하다. 또한, Side Effect가 없어 설계가 용이하며 캐싱에도 유리하다.

 

 

Java에서 불변 객체를 만드는 방법

setter 메서드 제공

객체의 상태값을 변경하는 setter 메서드를 아예 만들지 않는 방법이다.

상태 값을 변경할 필요가 없는 클래스에 setter 메서드를 추가하는 건 불필요하다.

 

final class 선언

클래스 자체를 final로 선언하면 다른 클래스에서 상속받는 게 불가능하기 때문에 부모 클래스에 선언되어 있는 메서드 오버라이딩이 불가능하다.

 

모든 필드 final 선언

초기화 이후 필드 값 변경을 방지한다.

 

모든 필드 private 선언

클래스의 모든 필드를 private으로 선언해 외부 접근을 막아 상태 변경을 방지한다.

 

생성자와 getter 메서드에서 깊은 복사 사용

참조 타입 필드를 깊은 복사 해 불변성을 유지한다.

생성자와 getter 메서드에서 깊은 복사를 사용하여 원본 배열의 변경으로부터 객체를 보호한다.

 

깊은 복사 : '값'을 새로운 메모리 공간에 복사하는 것을 의미.

얕은 복사 : '주소'를 복사한다는 의미.