Java - Immutable Class vs Mutable Class


1. Immutable Class (불변 클래스)

  • 불변 클래스는 멀티스레드 환경에서 동기화 처리 없이 객체를 공유할 수 있다.
    • 불변이기 때문에 객체가 안전하다. 그렇기에 동기화 처리 없이 객체를 공유할 수 있는 것이다.
  • 대신 객체가 가지는 값마다, 새로운 객체를 필요로 한다. 따라서 메모리 누수와 새로운 객체 생성으로 인해 성능 저하가 생길 수 있다.
      public class ImmutableString {
          private final String name;
          public ImmutableString(String name){
              this.name = name;
          }
          @Override
          public String toString(){
              return this.name;
          }
      }
    
    • 이런게 불변 클래스이다.
    • 이러면 생성자에서 처음 name을 받아올 때를 제외하고는 필드 값을 바꿀 수 없게된다.
  • 대표적인 예시로는 String 클래스가 있다.
    • String은 불변클래스이고 a = “b”; 이렇게 수정하는 순간 내부적으로는 heap에 새로운 인스턴스값을 생성하고, a가 그 값을 바라보게 된다. 그리고 “a”는 더이상 아무도 참조하고 있지 않다면, GC의 대상이 된다.



2. Mutable Class (가변 클래스)

  • 가변 클래스는 heap 메모리 안에서의 값들을 언제든 바꿔줄 수 있다. 대신 멀티 스레드 환경에서 별도의 동기화 처리가 필요하다.
      public class MutableString {
          private String name;
          public MutableString(String name){
              this.name = name;
          }
          @Override
          public String toString(){
              return this.name;
          }
          public void setName(String name) {
              this.name = name;
          }
      }
    
    • 이렇게 setName을 통해 변수 값을 바꿔 줄 수 있는 클래스가 대표적인 가변 클래스라고 할 수 있다.
    • 대표적으로는 StringBuilder와 StringBuffer 등이 있다.






results matching ""

    No results matching ""