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