본문 바로가기
자바

자바에서의 불변 객체 (Immutable Object)

by 이상한나라의개발자 2024. 4. 3.

불변 객체란 생성 후 상태(객체가 담고 있는 값)를 변경할 수 없는 객체를 말합니다. 불변 객체는 여러 스레드에 의해 동시에 사용되어도 상태가 변경되지 않으므로 동시성 문제가 발생하지 않습니다. 그런 이유로 불변 객체는 안전하게 재사용될 수 있습니다. 예를 들어, String 객체는 여러 참조에서 공유될 수 있습니다.

 

불변 객체 생성

  • 클래스를 final로 선언하여 상속을 방지합니다.
  • 모든 필드를 private final로 선언합니다.
  • 외부에서 필드의 값을 변경할 수 있는 setter 메서드를 제공하지 않습니다.
  • 생성자를 통해서만 상태를 설정할 수 있고, 객체 생성 후에는 이 상태를 변경할 수 없습니다.
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;
    }
}

 

public class TestImmutablePerson {
    public static void main(String[] args) {
        ImmutablePerson person = new ImmutablePerson("John Doe", 30);
        // 'person'의 나이를 변경하려면, 새로운 객체를 생성해야 함
        ImmutablePerson olderPerson = new ImmutablePerson(person.getName(), person.getAge() + 1);

        System.out.println("Original Age: " + person.getAge()); // 30
        System.out.println("New Age: " + olderPerson.getAge()); // 31
    }
}

 

이 방식은 기존 객체의 상태를 변경하는 대신, 상태가 변경된 새로운 객체를 생성하여 사용합니다. 이를 통해 객체의 불변성을 유지할 수 있습니다. 다른 방식으로는 불변 객체 안에서 메서드를 통해 새로운 객체를 생성하여 반환하는 방식은 불변 객체의 상태를 "변경" 하는 것처럼 보이게 하면서도 객체의 불변성을 유지할 수 있는 방법입니다. ( 불변 객체의 새로운 속성을 통한 반환은 with으로 메서드를 만드는게 관례입니다.)

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;
    }

    // 나이를 변경하는 메서드: 변경된 나이를 가진 새로운 ImmutablePerson 객체를 반환
    public ImmutablePerson withAge(int newAge) {
        return new ImmutablePerson(this.name, newAge);
    }
}

 

public class TestImmutablePerson {
    public static void main(String[] args) {
        ImmutablePerson person = new ImmutablePerson("Jane Doe", 28);

        // withAge() 메서드를 사용하여 나이를 변경
        ImmutablePerson personWithNewAge = person.withAge(29);

        System.out.println("Original Age: " + person.getAge()); // 28
        System.out.println("New Age: " + personWithNewAge.getAge()); // 29
    }
}

'자바' 카테고리의 다른 글

String 클래스  (0) 2024.04.04
자바에서 동일성, 동등성 비교하기  (1) 2024.04.03
Parallel Stream  (1) 2024.02.06
Optional<T>  (0) 2024.02.06
Stream API  (0) 2024.02.02