Skip to content

Latest commit

 

History

History
81 lines (42 loc) · 3.75 KB

immutable_object.md

File metadata and controls

81 lines (42 loc) · 3.75 KB

불변 객체

불변 객체란?

불변 객체란 객체 생성 이후 내부의 값이 변하지 않는 객체이다.

대표적으로 String 이 있는데, String은 값이 변하지 않는다.

String은 a라는 값을 할당하면 내부적으론 "a"라는 값의 객체를 만들고 그 객체를 참조하게 된다.

그래서 2개의 String에 같은 값을 넣고 ==으로 동일성 비교를 하면 True가 반환된다.

new 키워드를 통해서 같은 값을 만들면 강제적으로 새로운 객체를 만든다.

따라서 동일성 비교시 False가 반환되고, 동등성 비교를 해야 True가 반환된다.

이렇듯 String에서는 결코 값이 변하지 않고, 값을 새로 할당하기만 한다.

Java의 책으로 유명한 Effective Java에서는 다음과 같이 말한다.

클래스들은 가변적이여야 하는 매우 타당한 이유가 있지 않는 한 반드시 불변으로 만들어야 한다. 만약 클래스를 불변으로 만드는 것이 불가능하다면, 가능한 변경 가능성을 최소화하라.

불변 객체의 장점

  • 병렬 처리에 좋다.

    멀티 쓰레드 환경에서는 동기화 문제가 발생하는데, 이러한 동기화 문제가 발생하는 이유는 같은 자원에 쓰기 작업이 발생하기 때문이다.

    하지만 불변 객체는 쓰기 작업이 존재하지 않기 때문에 항상 같은 값을 반환하게 된다.

  • 실패 원자적인 메소드를 만들기 좋다.

    가변 객체로 작업 도중, 예외가 발생하면 해당 객체는 불완전한 객체가 될 확률이 높다.

    하지만 불변 객체는 메소드 호출 시의 상태와 동일한 상태를 유지하기 때문에 다음 로직을 안전하게 실행할 수 있다.

  • 부수 효과를 피해 오류 가능성을 최소화 할 수 있다.

    부수 효과란 객체의 수정자가 있을 때, 필드의 값이 변경되는 등의 변화가 발생하는걸 의미한다.

    여러 메소드에서 한 객체의 값을 변경하게 되면 객체의 값을 예측하기 어렵다.

    따라서 유지보수가 어렵다.

  • 다른 사람이 작성한 함수를 예측 가능하게 사용할 수 있다.

    우리가 다른 사람이 작성한 함수를 사용할 때, 매개변수로 넘겨준 객체의 값이 변할 수 있기 때문에 조심히 사용해야 한다.

    하지만 불변 객체라면 값이 변할 걱정을 하지 않아도 된다.

    또한 불필요한 시간을 절약할 수 있는데, 우리가 굳이 메소드의 내부를 들여다보지 않아도 된다.

  • 메소드의 내부를 들여다보지 않아도 된다.

    위에서 말했듯 우리가 메소드를 사용할 때 조심해야 한다.

    따라서 메소드가 어떻게 동작하는지, 어떤 과정을 거치는지 알고 객체가 변하는 부분이 있는지 항상 확인해야 한다.

    하지만 불변 객체라면 굳이 안을 들여다보지 않아도 객체가 변하지 않는게 보장되기 때문에 확인하지 않아도 된다.

  • 가비지 컬렉터의 효율을 높여준다.

    불변 객체를 사용하게 되면 가비지 컬렉터가 스캔해야 하는 범위가 줄어들게 된다.

불변 객체 규칙

  • 모든 필드를 private final로 선언해야 한다.

  • 객체 상태 변경을 위한 메소드를 제공하지 말아야 한다.

    setter와 같은 메소드를 제공하면 안된다.

  • 클래스 확장을 막도록 해라.

    하위 클래스에서 인스턴스 변수 수정을 막아야 한다.

    모두 private로 선언하거나 final 키워드를 붙이면 된다.

  • 자신 이외에는 가변 컴퍼넌트에 접근하지 못하도록 해라.

    java.Date 타입과 같이 가변객체에 접근할 수 있다면 불변 객체가 깨지게 된다.