객체 지향 프로그래밍에 있어서 불변객체(immutable object)는 생성 후 그 상태를 바꿀 수 없는 객체를 말한다.
반대 개념으로는 가변(mutable) 객체로 생성 후에도 상태를 변경할 수 있다.
객체 전체가 불변인 것도 있고, C++에서 const 데이터 멤버를 사용하는 경우와 같이 일부 속성만 불변인 것도 있다. 또, 경우에 따라서는 내부에서 사용하는 속성이 변화해도 외부에서 그 객체의 상태가 변하지 않은 것 처럼 보인다면 불변 객체로 보기도 한다.
불변 객체를 사용하면 복제나 비교를 위한 조작을 단순화 할 수 있고, 성능 개선에도 도움을 준다. 하지만 객체가 변경 가능한 데이터를 많이 가지고 있는 경우엔 불변이 오히려 부적절한 경우가 있다. 이 때문에 많은 프로그래밍 언어에서는 불변이나 가변 중 하나를 선택할 수 있도록 하고 있다.
💨 즉 불변객체는 재할당은 가능하지만, 한번 할당하면 내부 데이터를 변경할 수 없는 객체
객체에 값을 할당하면 내부 데이터를 변경시킬 수 없다는 것입니다.
대표적인 예로 String, Integer, Boolean 등이 있습니다.
String은 String str="a", str="ab"
이런 식으로 사용하기 때문에 값이 변경한다고 생각하여 불변객체가 아닌 것으로 착각하기 쉽습니다.
class MutablePerson {
public int age;
public int name;
public MutablePerson(int age, int name) {
this.age = age;
this.name = name;
}
}
class ImmutablePerson {
private final int age;
private final int name;
public ImmutablePerson(int age, int name) {
this.age = age;
this.name = name;
}
}
위와 같이 만들면 외부에서 값을 수정 불가
장점
객체에 대한 신뢰도가 높아집니다.
생성자, 접근메소드에 대한 방어 복사가 필요없습니다.
멀티스레드 환경에서 동기화 처리 없이 객체를 공유할 수 있습니다.
단점
객체가 가지는 값마다 새로운 객체가 필요합니다.