### **1. 데이터 변경에 의한 부작용 방지**

불변 객체는 그 상태가 변하지 않기 때문에, 데이터 변경에 의한 **예측할 수 없는 부작용**을 방지할 수 있습니다. 특히 **멀티스레딩 환경**에서는 **불변 객체**를 사용하면 **동기화 문제**를 피할 수 있습니다. 여러 스레드에서 동시에 접근해도 상태가 변경되지 않으므로, **쓰레드 안전성(Thread Safety)**을 보장할 수 있습니다.

여러 스레드에서 `User` 객체를 동시에 변경하려고 하면 문제가 발생할 수 있지만, 불변 객체는 안전하게 공유할 수 있습니다.

### **2. 객체의 상태 추적 용이**

불변 객체는 한 번 설정된 후 상태가 변하지 않으므로 **객체의 상태가 정확하게 추적**됩니다. 특히, **데이터베이스 트랜잭션**이나 **로그 시스템**처럼 **객체 상태의 변화를 기록하고 추적**하는 것이 중요한 상황에서는 불변 객체가 유리합니다.

**불변** 객체는 **트랜잭션**이 진행되는 동안 변경될 수 없으므로, 언제든지 정확한 상태를 추적할 수 있습니다.

### **3. 값 비교의 용이성**

불변 객체는 **값이 같으면 동일 객체로 취급**할 수 있기 때문에, 객체 비교가 매우 간단합니다. 값 비교를 **참조 비교**로 처리할 수 있기 때문에, 비교 연산이 **효율적**입니다.

**불변 객체**는 동일한 값일 경우 **참조 비교**로 처리할 수 있어 효율적인 비교가 가능합니다.

### **4. 복잡한 상태 변화 방지**

불변 객체는 상태 변경을 방지하여 **객체의 상태에 의한 오류**를 예방할 수 있습니다. 예를 들어, **데이터 무결성**을 보장해야 하는 **신뢰성이 중요한 시스템**에서 불변 객체는 유용합니다. **변경 가능한 객체**는 다양한 상황에서 상태를 추적하거나 수정할 때 오류를 일으킬 가능성이 있기 때문입니다.

**UserSettings** 객체는 불변이므로 설정이 변경될 때마다 새로운 객체를 반환합니다. 변경이 예상되는 값일지라도 기존 객체가 **변경되지 않으므로** 안전합니다.

### **5. 예측 가능한 동작**

불변 객체는 언제나 동일한 상태를 유지하므로, **예측 가능한 동작**을 보장합니다. 이를 통해 코드의 **가독성**과 **유지보수성**을 높일 수 있습니다. 특히 복잡한 애플리케이션에서 **객체의 상태 변화에 따른 오류**를 줄이기 위해 불변 객체가 필요합니다.