[Java] Immutable Object

아현·2021년 11월 21일
0

Java

목록 보기
6/13
post-thumbnail

출처


Immutable Object


  • 객체 지향 프로그래밍에 있어서 불변객체(immutable object)는 생성 후 그 상태를 바꿀 수 없는 객체를 말한다.

    • 반대 개념으로는 가변(mutable) 객체로 생성 후에도 상태를 변경할 수 있다.

      • 객체 전체가 불변인 것도 있고, C++에서 const 데이터 멤버를 사용하는 경우와 같이 일부 속성만 불변인 것도 있다. 또, 경우에 따라서는 내부에서 사용하는 속성이 변화해도 외부에서 그 객체의 상태가 변하지 않은 것 처럼 보인다면 불변 객체로 보기도 한다.

        • 예를 들어, 비용이 큰 계산의 결과를 캐시하기 위해 메모이제이션(Memoization)을 이용하더라도 그 객체는 여전히 불변하다고 볼 수있다. 불변 객체의 초기 상태는 대개 생성 시에 결정되지만 객체가 실제로 사용되는 순간까지 늦추기도 한다.
    • 불변 객체를 사용하면 복제나 비교를 위한 조작을 단순화 할 수 있고, 성능 개선에도 도움을 준다. 하지만 객체가 변경 가능한 데이터를 많이 가지고 있는 경우엔 불변이 오히려 부적절한 경우가 있다. 이 때문에 많은 프로그래밍 언어에서는 불변이나 가변 중 하나를 선택할 수 있도록 하고 있다.


💨 즉 불변객체는 재할당은 가능하지만, 한번 할당하면 내부 데이터를 변경할 수 없는 객체


  • 객체에 값을 할당하면 내부 데이터를 변경시킬 수 없다는 것입니다.

    • 대표적인 예로 String, Integer, Boolean 등이 있습니다.

    • String은 String str="a", str="ab" 이런 식으로 사용하기 때문에 값이 변경한다고 생각하여 불변객체가 아닌 것으로 착각하기 쉽습니다.

      • 하지만 이것은 str가 처음에 참조하고 있는 "a"값이 "b"로 변경되는 것이 아니라 "b"라는 새로운 객체를 만들고 그 객체를 str이 참조하게 하는 것입니다.



<불변이 아닌 클래스>



class MutablePerson {
   public int age;
   public int name;
    
   public MutablePerson(int age, int name) {
    	this.age = age;
        this.name = name;
    }
}

  • 외부에서 age나 name을 변경 가능



<불변 클래스>


class ImmutablePerson {
    private final int age;
    private final int name;
    
    public ImmutablePerson(int age, int name) {
    	this.age = age;
        this.name = name;
    }
}

  • 위와 같이 만들면 외부에서 값을 수정 불가

    • final 변수이므로 당연히 Setter 메서드를 작성할 수 없습니다.



Immutable Object의 장단점


  • 장점

    • 객체에 대한 신뢰도가 높아집니다.

      • 객체가 한번 생성되어서 그게 변하지 않는다면 transaction 내에서 그 객체가 변하지 않기에 우리가 믿고 쓸 수 있기 때문입니다.
    • 생성자, 접근메소드에 대한 방어 복사가 필요없습니다.

    • 멀티스레드 환경에서 동기화 처리 없이 객체를 공유할 수 있습니다.


  • 단점

    • 객체가 가지는 값마다 새로운 객체가 필요합니다.

      • 따라서 메모리 누수와 새로운 객체를 계속 생성해야하기 때문에 성능저하를 발생시킬 수 있습니다.
profile
For the sake of someone who studies computer science

0개의 댓글