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