[JAVA] Immutable(불변) / Mutable(가변)
2024. 2. 23. 16:06ㆍWeb/JAVA
1. 가변(Mutable) 객체
- 가변 객체는 값을 변경할 수 있는 객체
- 여기서 값은 메모리의 주소를 의미합니다.
- 가변 객체의 경우 값을 변경한다고 해서 저장되어있는 메모리의 위치가 변하지 않습니다.
- 언제든지 값을 바꿀수 있다보니, 멀티 스레드 환경에서 사용하려면 별도의 동기화 처리가 필요합니다.
- 대표적인 가변객체로는 ArrayList, HashMap, StringBuilder, StringBuffer
2. 불변(Immutable) 객체
- Java에서 Class의 인스턴스가 생성된 이후에 내부 상태를 변경 할 수 없는 객체
- 불변 객체는 멀티스레드 환경에서도 안전하게 사용할 수 있다는 신뢰성 보장하며, 대표적으로 String등 이 존재한다
- 이외에도 커스텀 객체를 생성하여 내부 상태가 변경되지 않게 만들면(private final), 그것도 불변객체이다.
장점
- Thread-safe 하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 된다.
- 멀티 스레드 환경에서 동기화 문제가 발생하는 이유는 공유자원에 동시 쓰기 연산 때문인다.
- 하지만 공유자원 불변 객체라면, 항상 동일한 값만 반환하므로, 동기화를 고려할 필요가 없다.
- 이는 안정성을 보장할 뿐만 아니라, 동기화를 하지 않음으로서 성능 상 이점도 있다.
- 실패 원자적인(Failure Atomic) 메소드를 만들 수 있다.
- 가변 객체로 작업을 하다가 예외발생 시 객체 상태를 보장 할수 없는데 반해 불변 객체는 메소드 호출 전 상태를 유지
- Cache, Map, Set 등의 요소로 활용하기 적합하다.
- 만약 캐시나 Map, Set 등으로 사용되는 객체가 변경되었다면 이를 갱신하는 등의 작업이 필요하다
- 하지만 객체가 불변하다면 데이터가 저장된 이후에 다른 부가 작업을 고려하지 않아도 된다.
- Side Effect를 피해 오류 가능성을 최소화 할 수 있다.
- 불변 객체는 기본적으로 값의 수정이 불가능 하므로, 변경 가능성이 적으며 이는 오류를 줄여 유지보수성이 높은 코드
- 다른 사람이 작성한 함수를 예측 가능하며 안전하게 사용 할 수있다.
- 불변 객체는 값이 변하지 않음을 보장하므로, 우리가 다른 사람의 코드를 변경에 대한 불안 없이 사용 가능하다.
'Web > JAVA' 카테고리의 다른 글
[JAVA] 컴파일 과정 (0) | 2024.02.26 |
---|---|
[JAVA] String / StringBuffer / StringBuilder (0) | 2024.02.23 |
[JAVA] 래퍼 클래스 (Wrapper Class) (0) | 2024.02.23 |
[Java] 원시타입 / 참조타입 (0) | 2024.02.23 |
[Java] 메모리 관리 (0) | 2024.02.23 |