불변객체와 가변객체

지인호·2022년 1월 8일
0

TIL

목록 보기
13/28
post-thumbnail

mutable, immutable

class 의 instace 가 생성된 시점부터 내부상태가 변경되는가에 따라 불변객체와 가변객체로 나뉜다.

불변객체

class 의 instance 가 생성된 시점부터 내부상태가 일정하게 유지되는 객체이다.

즉, “생성 후 변경이 불가능한 객체” 이다.

대표적인 예시로는 String 클래스가 있다

가변객체

class 의 instance 가 생성된 시점부터 내부상태가 변경될 수 있는 객체이다.

즉 “생성 후 변경이 가능한 객체” 이다.

대부분의 객체가 가변객체이며, VO, POJO, StringBuilder/Buffer 또한 가변객체이다

불변객체가 필요한 이유

불변객체는 instance 생성시점 즉 메모리에 올라간 시점부터 변경이 불가능하여 자동적으로
thread-safe 한 특성을 띄고있다. 객체 자체가 Read-only 이기 때문이다.

하지만, 가변객체는 Writtable 특성을 띄고 있어, 그 자체로는 thread-safe 하지 않고, 추가적으로 동기화 처리를 해주어야한다. 여러 쓰레드에서 수정하려고 시도하였을 경우, CPU 메모리와 메인메모리간의 값이 동일하다고 보장할 수 없기 때문이다.

불변객체 작성법

간단하다. 객체를 Read-only 로 만들면 된다

  • 클래스에 존재하는 모든 Field 를 final 로 선언한다 (Setter 사용 불가)
  • 클래스를 상속 불가능하게 만든다 class 를 final 로 선언하거나, 생성자를 private 로 선언하면 된다.
  • 모든 field 변수가 final 이 아닐 경우, 즉 field 가 가변객체(ex, List) 일 경우, 해당 field 의 접근시 방어적 복사본 전략을 사용한다.
    즉, 가변객체 field 에 접근할 경우, copy 객체를 생성하여 반환한다.
profile
테오의 스프린트 17기 퍼실리테이터

0개의 댓글