불변 객체는 생성 이후 내부의 상태를 수정할 수 없는 객체. 인스턴스가 초기화 되면 해당 내용은 객체의 전체 라이프 사이클 동안 변경되지 않는 상태로 유지된다.
단순성 - 불변 객체는 생성 후 변하지 않으므로 코드의 복잡성이 줄어들고 유지관리가 더 쉬워지므로 추론하기가 더 쉽다.
Thread safe하다 - 상태가 변할 수 없으므로 동기화의 위험없이 여러 사용자가 동시에 접근해도 괜찮다. 이는 다중 스레드 환경이나 동시 프로그래밍 환경에서 특히 유용하다.
실패 원자적인 메소드를 만들 수 있다 - 메소드 실행 중에 예외가 발생하면 객체의 상태가 변경되지 않고 유지됩니다. 이렇게 하면 객체가 일관된 상태로 유지되고 예외가 발생하기 전과 같은 상태로 다시 처리될 수 있습니다.
부수효과 방지해 오류 최소화 - 메서드가 실행될 때 발생할 수 있는 객체 또는 변수의 상태에 대한 의도하지 않은 변경을 방지. 버그 가능성을 줄이고 코드를 더 예측가능하고 추론하기 쉽게 만든다.
예측 가능한 동작 - 초기화후 상태가 변경되지 않기 때문에 쉽게 예측 가능. 객체의 라이프 사이클동안 일관된 동작 보장. 다른 컨텍스트에서 동작하는 방식을 쉽게 이해하고 디버깅 프로세스 단순화 가능.
다른 개체에 대한 부작용 없음 - 불변 객체는 내부 상태가 변경되지 않기 때문에 메서드에 대한 파라미터로 전달 될 때 개발자는 객체의 상태가 예기치 않게 수정되지 않을 거라고 확신할 수 있으므로 코드의 복잡성을 줄이고 의도치 않은 결과 방지.
보안 - 변경할 수 없는 객체는 신뢰할 수 없는 구성 요소간에 안전하게 공유하거나 의도하지 않은 수정의 위험 없이 메서드 간에 전달 할 수 있으므로 애플리케이션의 보안을 개선하는데 도움된다.
JAVA에서는 final 키워드를 통해 불변객체 생성 가능
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;
}
}