💡불변 객체(Immutable Object)
불변 객체란 한 번 생성되면 그 상태가 변하지 않는 객체를 의미한다. 즉, 한 번 만들어진 객체는 외부에서 값을 변경할 수 없고, 변경이 필요하다면 새로운 객체를 생성해서 반환한다.
자바에서 불변 객체의 예로는 String, Integer와 같은 래퍼클래스와 LocalDate, LocalDateTime 등이 있다.
String str = "hello";
str = str + " world";
System.out.println(str);
위 코드만 봤을 때는 변수 str이 참조하는 값에 World 문자열을 더해서 str 변수를 업데이트 한것 같지만, 실제 메모리에서는 hello world값을 저장할 영역을 따로 만들고 변수 str을 다시 참조하는 식으로 동작한다.

👍불변성의 장점
1. Thread Safety (스레드 안전성)
- 객체의 상태가 변하지 않기 때문에 여러 스레드가 동시에 접근해도 데이터가 훼손될 염려가 없다. 따라서 별도의 동기화 처리가 필요 없어 멀티스레드 환경에서 안전합니다.
2. 예측 가능한 상태
- 객체의 상태가 불변이므로, 개발자가 해당 객체의 상태가 갑자기 바뀌는 것을 걱정할 필요가 없다. 즉, 코드의 안정성과 예측 가능성을 높여 디버깅을 쉽게 만든다.
3. 캐싱 (Caching)
- 객체의 해시 코드가 생성 후 변하지 않으므로, HashMap이나 HashSet과 같은 자료구조에서 키(Key)로 사용하기에 매우 적합하다. 상태가 변하지 않아 해시 충돌 위험이 줄어듭니다.
4. 객체의 일관성 보장
- 생성된 이후 상태가 변하지 않으므로 시스템 내에서 해당 객체를 사용하는 모든 부분에서 일관성을 보장할 수 있다.
5. 보안성
- 불변객체는 외부에서 상태를 변경할 수 없기 때문에, 객체의 내부 상태를 보호하는데 유리하다.
6. 부작용(Side Effect) 최소화
- 불변 객체는 동일한 메서드를 호출해도 항상 동일한 결과를 반환하며, 함수형 프로그래밍에서는 부작용 없는 코드를 선호하기 때문에 불변 객체가 자주 사용된다.
👎불변성의 단점
1. 메모리 과도 사용
- 불변 객체는 내부 상태가 변경될 때마다 새로운 객체를 생성한다. 이로 인해 불필요한 메모리 사용을 초래할 수 있다. -> 해결방법 : StringBuilder, StringBuffer
2. 성능 저하
- 상태 변경이 빈번한 경우, 불변 객체를 계속해서 생성하고 가비지 컬렉션이 이를 처리하게 되므로 성능 저하가 발생할 수 있다.
3. 구현 복잡성 증가
- 복잡한 연산을 수행하면서 불변성을 유지하려면 객체 설계와 구현이 복잡해 질 수 있다. 모든 필드를 불변으로 유지해야 하고, 내부 상태르 변경하는 메서드를 제공하지 않아야 하므로 설계시 신경쓸 부분이 많아진다.
Immutable Object가 무엇이고, 왜 사용하나요?
Immutable 객체는 생성 후 상태가 바뀌지 않는 객체로, 자바에서는 String을 예시로 들 수 있습니다. 불변 객체는 상태가 변하지 않으므로 재사용에 유리하고 캐시에 적합하니다. 또한, 객체의 일관성을 보장하며 보안성이 높습니다.