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 등이 있다.