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