한 번 객체가 생성되면 내부 상태를 수정하거나 변경할 수 없다.
불변 객체는 객체 지향 프로그래밍에서 많은 이점을 제공한다.
ex) Integer, String
기본 타입(Primitive type)
기본 타입은 값을 복사한 것이기 때문에 a의 값이 변하지 않음
int a = 10;
int b = a;
b = 20;
// a = 10
// b = 20
객체 타입
객체 타입은 같은 참조를 전달하기 때문에 의도치 않았던 a의 값도 같이 변함
Animal animal1 = new Animal("Dog");
Animal animal2 = animal1;
animal2.setName("Cat");
// animal1 = Cat
// animal2 = Cat
-> Setter 사용을 지양해야 하는 이유
생성자 또는 Builder를 사용하여 값을 초기화하는 방법으로 해결