자바의 객체는 기본적으로 힙 영역에 할당되고 스택 영역에 참조값을 갖는 참조 타입 변수를 통해 데이터에 접근한다. 이러한 객체는 Mutable(가변) 객체와 Immutable(불변) 객체로 나눌 수 있다.

- Mutable은 객체의 수정을 허용하나, Immutable은 객체의 수정을 허용하지 않기 때문에 set 메소드가 없다!
- 수정이 필요할 경우 Mutable 객체는 기존의 객체에 수정사항을 곧바로 반영한다. 하지만 Immutable 객체의 경우 기존의 객체는 그대로 두고 수정사항을 반영한 새로운 객체를 생성한다는 점에서 차이가 있다.
Immutable(불변) 객체의 장단점
장점:
- Thread-safe하여 멀티스레드 프로그래밍에 유용하며, 동기화를 고려하지 않아도 된다. 멀티 스레드 환경에서 동기화 문제가 발생하는 이유는 공유 자원에 동시에 쓰기 때문이다.
- 실패 원자적인(Failure Atomic) 메소드를 만들 수 있다. 가변 객체를 통해 어떠한 작업을 하는 도중 예외가 발생하면 해당 객체가 불안정한 상태에 빠질 수 있고 또 다른 에러를 유발할 수 있다. 하지만 불변 객체라면 어떠한 예외가 발생하여도 메소드 호출 전의 상태를 유지할 수 있을 것이다.
단점:
- 객체의 값이 할당할 때마다 새로운 객체가 필요하다. 따라서 메모리 누수와 성능저하를 발생시킬 수 있다.
불변 객체를 만드는 방법
- final 키워드 이용
- 자바의 불변성을 확보 가능
- 변수에 final 키워드를 붙이면 참조값을 변경 못하도록 해 불변성을 확보할 수 있다.
- 불변 객체를 사용하는 클래스 생성 방법
1) 클래스를 final로 선언
2) 모든 클래스 변수를 private와 final로 선언
3) 객체를 생성하기 위한 생성자/정적 팩토리 메소드 추가
4) 참조에 의해 변경 가능성이 있는 경우 방어적 복사를 이용하여 전달한다.
출처:
https://choiblack.tistory.com/47
https://velog.io/@guswlsapdlf/Java%EC%9D%98-Mutable%EA%B3%BC-Immutable