Mutable, Immutable

동동주·2024년 4월 11일

CS스터디_자바

목록 보기
9/19

자바의 객체는 기본적으로 힙 영역에 할당되고 스택 영역에 참조값을 갖는 참조 타입 변수를 통해 데이터에 접근한다. 이러한 객체는 Mutable(가변) 객체와 Immutable(불변) 객체로 나눌 수 있다.

  • Mutable은 객체의 수정을 허용하나, Immutable은 객체의 수정을 허용하지 않기 때문에 set 메소드가 없다!
  • 수정이 필요할 경우 Mutable 객체는 기존의 객체에 수정사항을 곧바로 반영한다. 하지만 Immutable 객체의 경우 기존의 객체는 그대로 두고 수정사항을 반영한 새로운 객체를 생성한다는 점에서 차이가 있다.

Immutable(불변) 객체의 장단점

장점:

  • Thread-safe하여 멀티스레드 프로그래밍에 유용하며, 동기화를 고려하지 않아도 된다. 멀티 스레드 환경에서 동기화 문제가 발생하는 이유는 공유 자원에 동시에 쓰기 때문이다.
  • 실패 원자적인(Failure Atomic) 메소드를 만들 수 있다. 가변 객체를 통해 어떠한 작업을 하는 도중 예외가 발생하면 해당 객체가 불안정한 상태에 빠질 수 있고 또 다른 에러를 유발할 수 있다. 하지만 불변 객체라면 어떠한 예외가 발생하여도 메소드 호출 전의 상태를 유지할 수 있을 것이다.
    단점:
  • 객체의 값이 할당할 때마다 새로운 객체가 필요하다. 따라서 메모리 누수와 성능저하를 발생시킬 수 있다.

불변 객체를 만드는 방법

  • final 키워드 이용
    - 자바의 불변성을 확보 가능
    - 변수에 final 키워드를 붙이면 참조값을 변경 못하도록 해 불변성을 확보할 수 있다.
  • 불변 객체를 사용하는 클래스 생성 방법
    1) 클래스를 final로 선언
    2) 모든 클래스 변수를 private와 final로 선언
    3) 객체를 생성하기 위한 생성자/정적 팩토리 메소드 추가
    4) 참조에 의해 변경 가능성이 있는 경우 방어적 복사를 이용하여 전달한다.

출처:
https://choiblack.tistory.com/47
https://velog.io/@guswlsapdlf/Java%EC%9D%98-Mutable%EA%B3%BC-Immutable

0개의 댓글