Mutable | Immutable |
---|---|
생성된 이후 수정 가능 | 생성된 이후 수정 불가능 |
이미 존재하는 객체에 재할당(값 변경) | 이미 존재하는 객체이더라도 새로운 객체를 생성하여 재할당 |
값을 변경할 수 있는 메소드 제공 | 값을 변경할 수 있는 메소드 제공 x |
Mutable class일 경우 Getter와 Setter 존재 | Immutable class일 경우 Getter와 Setter 미존재 |
thread safe하지 않을 수 있음(병렬처리 시 값 보장할 수 없게 됨) | thread safe(병렬처리 시 문제 없음) |
StringBuffer, StringBuilder, java.util.Date 등이 해당 | Legacy classes, Wrapper classes, String class 등이 해당 |
Mutable
은 객체의 수정을 허용하나,Immutable
인 경우 객체의 수정을 허용하지 ❌- 수정이 필요할 경우
Mutable 객체
는 기존의 객체에 수정사항을 곧바로 반영한다.- 그에 비해
Immutable 객체
의 경우 기존의 객체는 그대로 냅두고 수정사항을 반영한 새로운 객체를 생성한다는 점에서 차이가 있다.
->Immutable
의 대표적 예시로는 String class가 존재한다.
List
, ArrayList
, HashMap
, StringBuilder
,StringBuffer
,StringBuilder
, java.util.Date
등StringBuffer
Mutable
하게 동작한다.좀 더 자세히 들어가면 이 '불변 객체'를 생성하면 heap 영역에 객체가 생길 것이며 이 주소값을 가지는 변수가 stack에 생긴다.
곧, 불변 객체란 이 객체에 대한 값을 heap 영역에서는 수정할 수가 없다는 것이다.
그저 heap에 새로운 값을 가진 객체를 만들어 stack의 해당 참조변수의 레퍼런스 값을 변경해주는 것이다.
- 여기서도 같은 str 변수에 할당되었지만 str의 값을 abc에서 abcdef로 변경하였을 때, 메모리 주소 값도 같이 변경되었다.
- 이는 곧 1785210046의 메모리 주소에 할당된 abc란 값이 abcdef로 변한 것이 아니라 1151020327의 메모리 주소에 abcdef란 값을 가진 String 객체가 새로 생성된 것임을 나타낸다.
=> 따라서 String class는 Immutable하게 동작한다.
=> 무슨말이냐? 값이 변경되었기에 heap에서 새로운 값을 가진 객체를 생성하였고 이에 따라 실제 가리키는 레퍼런스 값도 수정되었다.
guswlsapdlf님의 글을 참조하여 작성하였습니다.
cantcoding님의 글을 참조하여 작성하였습니다.