String 클래스를 공부하면서 불변객체를 알아보았습니다.
불변객체란 정확히 무었이며 무슨 의도로 쓰이는 걸까요?
불변 객체에 대한 설명을 좀 더 명확하게 정리해 보겠습니다.
불변 객체(Immutable Object)는 객체 지향 프로그래밍에서, 한 번 생성된 후 그 상태가 변경될 수 없는 객체를 의미합니다. 이러한 객체는 내부의 데이터를 수정할 수 없습니다. 즉, 객체가 가지고 있는 값이 초기에 할당된 이후에는 변경되지 않습니다. 재할당을 통해 새로운 객체를 참조하는 것은 가능하지만, 기존 객체의 내부 상태를 변화시킬 수는 없습니다. String
, Integer
, Boolean
등의 클래스가 자바에서 대표적인 불변 객체의 예입니다.
Java의 String
클래스를 예로 들어 불변 객체의 동작 방식을 살펴보겠습니다.
String str = "a"; // (1)
str = "b"; // (2)
str = "Immutable"; // (3)
이 코드에서 일어나는 메모리 상의 변화를 단계별로 설명하면 다음과 같습니다:
str
이라는 참조 변수에 "a"
라는 문자열 객체가 힙(heap) 영역에 생성되어 할당됩니다."a"
객체를 변경하는 대신, "b"
라는 새로운 문자열 객체가 힙 영역에 생성됩니다. 그리고 str
참조 변수는 이제 "b"
객체를 가리킵니다. 이전에 생성된 "a"
객체는 더 이상 참조되지 않습니다."Immutable"
이라는 또 다른 새로운 문자열 객체가 힙 영역에 생성되고, str
참조 변수는 "Immutable"
객체를 가리키게 됩니다. 이 과정에서 "b"
객체 역시 더 이상 참조되지 않게 됩니다.결과적으로, (3)까지의 코드 실행 후에는 "a"
와 "b"
문자열 객체가 가비지 컬렉션(Garbage Collection, GC)의 대상이 됩니다. 이는 String
객체의 불변성 때문에 발생하는 현상입니다. String
객체의 값이 필요할 때마다 새로운 객체가 생성되고, 기존 객체는 변경되지 않으며, 더 이상 사용되지 않는 객체는 메모리에서 제거됩니다.
불변 객체를 사용하는 주된 의도는 다음과 같습니다:
String
리터럴은 자바 내부에서 재사용되어 메모리 사용을 최적화할 수 있습니다.불변 객체의 사용은 프로그램의 안정성과 예측 가능성을 높이며, 복잡한 상태 관리를 줄여주는 등 여러 이점을 제공합니다.
출처 : https://velog.io/@conatuseus/Java-Immutable-Object%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4
https://mangkyu.tistory.com/131
https://devoong2.tistory.com/entry/Java-%EB%B6%88%EB%B3%80-%EA%B0%9D%EC%B2%B4Immutable-Object-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://yeoonjae.tistory.com/entry/Java-%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4Immutable-Object%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90