본문 바로가기
Dev/Java

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

by 세대교체 2024. 10. 30.

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

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

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

 

 

불변성의 중요성

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

 

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

 

 

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

setter 메서드 제공 ❌

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

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

 

 

final class 선언

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

 

 

모든 필드 final 선언

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

 

 

모든 필드 private 선언

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

 

 

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

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

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

 

 

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

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