[Java] 불변 객체(Immutable Object)

·2025년 9월 20일
0

Java

목록 보기
9/13

💡불변 객체(Immutable Object)

불변 객체란 한 번 생성되면 그 상태가 변하지 않는 객체를 의미한다. 즉, 한 번 만들어진 객체는 외부에서 값을 변경할 수 없고, 변경이 필요하다면 새로운 객체를 생성해서 반환한다.
자바에서 불변 객체의 예로는 String, Integer와 같은 래퍼클래스와 LocalDate, LocalDateTime 등이 있다.

  • String을 예시로 들어보자.
String str = "hello";
str = str + " world";

System.out.println(str); // hello world

위 코드만 봤을 때는 변수 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을 예시로 들 수 있습니다. 불변 객체는 상태가 변하지 않으므로 재사용에 유리하고 캐시에 적합하니다. 또한, 객체의 일관성을 보장하며 보안성이 높습니다.

profile
배우고 기록하며 성장하는 백엔드 개발자입니다!

0개의 댓글