String 클래스로 살펴보는 불변(Immutable)객체
불변객체란?
불변객체란, 한 번 생성되면 그 상태를 변경할 수 없는 객체를 의미한다.
Java 의
String
은 대표적인 불변객체이다.
불변객체를 만드는 방법
모든 필드를
final
로 선언모든 필드는 초기화 후 수정할 수 없도록
final
로 선언합니다.
필드를
private
으로 선언필드를
private
으로 선언하여 외부에서 직접 접근할 수 없도록 합니다.
생성자를 통해 필드 초기화
생성자를 통해 객체 생성 시 모든 필드를 초기화하고, 그 이후에는 필드를 변경할 수 없게 합니다.
setter 메서드 제공하지 않기
필드 값을 변경할 수 있는 setter 메서드를 제공하지 않습니다.
변경 가능 객체를 반환하지 않기
필드가 객체라면, 객체의 참조를 반환할 때는 복사본을 반환하여 원본 객체가 변경되지 않도록 합니다. -> 위 코드에서 속성의 타입으로 사용되는
String
그 자체로 불변 객체이기 때문에, 원본을 그대로 반환한다.
클래스를
final
로 선언클래스를
final
로 선언하여 서브클래싱을 통해 객체의 불변성을 깨는 것을 방지합니다.
불변객체의 장단점
장점
스레드 안정성
불변 객체는 상태가 변하지 않기 때문에, 여러 스레드에서 안전하게 공유할 수 있다. 동기화의 필요성이 줄어들어 성능이 향상 될 수 있다.
단순성
상태 변화에 고민하지 않아도 되기 때문에 코드가 단순해진다.
메모리 효율성
자주 사용되는 불변 객체는 재사용 가능하므로 메모리를 효율적으로 사용할 수 있습니다. 예를 들어, 자바의
String
클래스는 문자열 상수 풀에서 재사용된다.
단점
객체 생성 비용
불변 객체는 상태 변경 시 새로운 객체를 계속 생성해야 하기 때문에, 객체 생성 비용이 증가 할 수 있다. 특히 복잡한 객체의 경우 성능에 영향을 미칠 수 있다.
메모리 사용량 증가
상태를 변경할 때마다 새로운 객체가 생성되기에, 메모리 사용량이 증가할 수 있습니다. 대량의 데이터나 빈번한 상태 변경이 필요한 경우에는 비효율적일 수 있다.
유연성 부족
불변 객체는 상태를 변경할 수 없기 때문에, 동적으로 상태를 변경해야 하는 경우 유연성이 떨어질 수 있다.
Last updated