티스토리 뷰

불변 클래스란?

그 인스턴스의 내부 값을 수정할 수 없는 클래스로, 인스턴스 내 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대로 변경되지 않는다.
예) 자바 플랫폼 라이브러리에는 String과 기본타입의 박싱된 클래스인 BigInteger와 BigDecimal이 여기 속한다.

불변 클래스의 장점

  • 설계 및 구현 용이
  • 낮은 오류 발생률

불변 클래스 생성에 대한 다섯 가지 규칙

  • 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다.
  • 클래스를 확장할 수 없도록 한다.
    하위 클래스에서 부주의하게 혹은 나쁜 의도로 객체의 상태를 변하게 만드는상태를 막아준다.
    대표적인 방법으로 class의 final 선언이 있다.
  • 모든 필드를 final로 선언한다.
    시스템이 강제하는 수단을 통해 설계자의 의도를 명확히 드러내는 방법이다. 새로 생성된 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동장하게끔 보장하는데도 필요하다.
  • 모든 필드를 private으로 선언한다.
    필드가 참조하는 가변 객체를 클라이언트에서 직접 접근해 수정하는 일이 없게 한다. 기술적으로는 기본 타입 필드나 불변 객체를 참조하는 필드를 public final로 선언해도 불변객체가 되지만, 이렇게 하면 다음 릴리스에서 내부 표현을 바꾸지 못하므로 권하지는 않는다.
  • 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
    클래스에 가변 객체를 참조하는 필드가 하나라도 있다면 클라이언트에서 그 객체의 참조를 얻을 수 없도록 해야한다.

불변 클래스 특징

  • 근본적으로 스레드 안전하여 따로 동기화할 필요가 없으며, 쓰레드 간에 영향을 줄 수 없기 때문에 안심하고 공유할 수 있다.
  • 불변 객체 끼리는 내부 데이터를 공유할 수 있다.
  • 객체를 만들 때 다른 불변 객체들을 구성요소로 사용하면 이점이 많다.
  • 불변 객체는 그 자체로 실패 원자성을 제공한다.
    상태가 절대 변하지 않으니 잠깐이라도 불일치 상태에 빠질 가능성이 없다.
  • 계산 비용이 큰 값을 처음 쓰일 때 계산하여 final이 아닌 필드에 캐시해놓음으로써 동일 값 요청시 캐시해둔 값을 반환해 계산 비용을 절감한다.
  • 불변으로 만들 수 없는 클래스라도 변경할 수 있는 부분을 최소한으로 줄이자.
  • 생성자는 불변식 설정이 모두 완료된, 초기화가 완벽히 끝난 상태의 객체를 생성해야 한다.
  • 값이 다르면 반드시 독립된 객체로 만들어야 한다.

가변 동반 클래스란?

불변 클래스와 거의 동일한 기능을 가지고 있지만 가변적인 클래스를 가변 동반 클래스라고 한다. 가변 동반 클래스는 주로 불변 클래스가 비즈니스 로직 연산 등 시간 복잡도가 높은 연산시 불필요한 클래스 생성을 막기 위해 내부적으로 사용한다.
대표적으로, 불변 클래스인 String에게 가변 동반 클래스인 StringBuffer가 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함