이뮤터블 객체(Immutable Object)
이뮤터블 객체는 생성 후 그 상태가 변하지 않는 객체를 말한다.
Java에서 대표적인 이뮤터블 객체로는 String, Integer, Float, Long 등이 있다.
정의만 보면 잘 와닿지가 않는다. 생성 후 상태가 변하지 않는다는 게 무슨말일까?
다음의 예시를 보면 이해가 쉽다.
String s = "hello";
System.out.println(System.identityHashCode(s)); // 245257410
s += "world";
System.out.println(System.identityHashCode(s)); // 1283928880
System.identityHashCode(): 객체를 특정할 수 있는 식별값을 반환하는 메서드이다.
s라는 String 객체에 "hello"를 할당해 준 뒤 "world"를 추가적으로 더해주었다.
언뜻보면 같은 s라는 객체에 그냥 문자열만 더해준 것이라 같은 값이 나올 것 같지만 놀랍게도 다른 값이 나왔다.
이것이 바로 이뮤터블 객체의 특징이다.
이뮤터블 객체는 초기화된 이후에는 수정할 수 없으며, 객체의 상태를 변경하려고 하면 기존 객체는 그대로 유지되고 변경된 새로운 객체가 생성된다.
객체라는 상자안에 값이 들어가 있다고 생각하기 쉬운데 이것이 아니라 객체는 단순히 값을 참조만 하는 것이다.
그 값이 바뀌면 기존의 참조를 끊고 다른 값을 참조하는 객체가 생성되는 것이다.
뮤터블 객체(Mutable Object)
뮤터블 객체는 반대로 생성 후에도 그 상태를 변경할 수 있는 객체를 말한다.
이 객체들은 내부 상태를 변경하는 메소드를 포함하고 있으며, 이 메소드들을 호출하면 객체의 실제 내용이 수정된다. Java에서 대표적인 뮤터블 객체로는 대부분의 컬렉션 클래스들(ArrayList, HashMap 등)과 StringBuilder, Date 등이 있다.
StringBuilder sb = new StringBuilder("hello");
System.out.println(System.identityHashCode(sb)); // 245257410
sb.append("world"); // 기존 객체의 상태를 변경
System.out.println(System.identityHashCode(sb)); // 245257410
다음과 같이 뮤터블 객체는 값을 변경해도 새로운 객체가 생성되는 것이 아닌 그 객체 내부의 상태를 변경하는 것이다.
장단점
- 이뮤터블 객체의 장점:
- 안전성과 예측성: 데이터가 변경되지 않기 때문에 버그 발생 확률이 낮아지고, 멀티스레드 환경에서도 안전하게 사용할 수 있다.
- 해시 키로 사용 가능: 객체의 상태가 변하지 않기 때문에, 객체의 해시코드가 일관되어 해시 기반 컬렉션의 키로 적합하다.
- 뮤터블 객체의 장점:
- 유연성과 효율성: 객체 상태를 바로 변경할 수 있어 메모리와 성능 상의 이점이 있다.
- 기능 확장성: 상태 변경이 필요한 복잡한 데이터 구조와 알고리즘에 적합하다.
'Java' 카테고리의 다른 글
[Java] HashMap - value값을 기준으로 정렬 (0) | 2024.07.23 |
---|---|
[Java] HashSet - 객체의 속성으로 중복 체크 (0) | 2024.06.21 |
[Java] 배열 정렬하기 (0) | 2024.06.16 |
[Java] 배열 복사 및 출력하기 (0) | 2024.06.02 |
[Java] String vs StringBuilder, 코딩테스트에서 StringBuilder를 쓰는 이유 (0) | 2024.04.23 |