가변 객체 (Mutable object)

가변 객체는 Java에서 Class의 인스턴스가 생성된 이후 내부 상태가 변경 가능한 객체다. 가변 객체는 멀티 스레드 환경에서 사용하려면 별도의 동기화 처리가 필요하며, 대표적인 가변 객체로는 ArrayList, HashMap, StringBuilder, StringBuffer 등이 존재한다. 이외에도 개발자가 커스텀 객체를 생성하여 객체 내부 상태를 변경할 수 있게 만든다면, 이것 또한 가변 객체다.

불변 객체 (Immutable object)

불변 객체는 가변 객체와 반대로 Java에서 Class의 인스턴스가 생성된 이후 객체 내부 상태를 변경할 수 없게 만든 객체다. 불변 객체는 멀티 스레드 환경에서 안전하게 사용할 수 있다는 신뢰성을 보장하며, 대표적인 불변 객체는 String 이다. 이외에도 개발자가 만든 커스텀 객체도 불변 객체로 만들 수 있다.

불변 객체의 장점

불변 객체를 만드는 방법

불변 객체는 read-only 메소드만 제공하며, 객체 내부 상태를 알려주는 메소드를 제공하지 않거나 제공할 경우 방어적 복사 또는 Unmodified 를 통해 제공한다.

또한, 객체의 필드는 모두 final 을 사용하여 처음 할당된 이후 상태가 바뀌지 않도록 해야 한다. 다만, 무조건 final 을 사용한다고 해서 해당 객체를 불변 객체라고 부를 수는 없다.