그냥 변수형도 뮤터블 / 이뮤터블, 즉 불변 / 가변으로 나눠서 설명 혹은 사용 경험을 물어보면 벙찐다.(내가 그랬다.)
기본이 중요! 라고 생각하다가도 가끔 이런 것도 대답 못할때 스스로 한심 + 와 꼭 생각 안날때 물어보냐 이렇게 비겁하게 생각하곤 한다.
그래서 확실히 정리하고자 글로 남겨본다.
Mutable Object
말 그대로 가변, 즉 내부의 값을 변경할 수 있는 객체다. 기본적으로 객체가 생성이 되기 위해서는 일정 영역의 메모리 할당으로 시작되는데, Mutable 객체는 생성된 메모리 안에서 값이 변경 가능함을 의미한다.
보통 function / array / object? 이 정도가 Mutable 객체라고 한다.
StringBuilder / StringBuffer 둘다 직접적인(literal) 할당은 안 되며 new 를 이용해서 만들어야 한다.
StringBuffer s2 = new StringBuffer("test");
StringBuilder s3 = new StringBuilder("test");
StringBuilder / StringBuffer 의 공통점은 가변, 즉 내부의 값을 변경할 수 있다는 것이다.

값을 추가할 수 있는 수많은 append 함수를 통해 이미 할당 된 메모리 공간에서의 값 변경이 가능하다.
StringBuilder / StringBuffer 의 차이점은 StringBuffer은 멀티스레드 위해 동기화 필요, StringBuilder은 동기화 불 필요하다는 점?
Immutable Object
불변 객체, 즉 메모리 한번 할당 되면 내부의 값이 변하지 않는 객체라는 것을 뜻한다. String / Boolean / Float / Long / Integer 정도가 있다.
이것들은 모두 = "" or = 숫자 형태로 만들 수 있는데 이 경우 해당 인스턴스에 값을 + 를 통해 변형하면 기존에 참조하던 값에서 새로운 값을 바라보게끔 메모리가 새로 할당이 되고, 기존의 값은 그냥 버려지게 된다. 이 경우 버려진 값은 GC (Garbage Collector) 가 가져가는데 문제는 언제 가져갈지 모른다.
그래서 String을 계속 생성하는 함수 혹은 클래스파일의 경우 퍼포먼스가 StringBuilder/Buffer 를 적절히 사용한 것보다 떨어질 수 밖에 없다. 메모리를 계속 생성 할테니까.
* new 로 생성하거나 = "" 로 생성하는 것들 둘 다 heap 메모리에 저장되긴 함. 그러나 ="" 로 만들어진 값은 heap 내에 String pool 이란 메모리영역이 생성되고, 그 안에서 메모리를 만든다고 한다. 그리고 그 안의 값은 불변.
하지만 장점은 한번 생성해두고 단순 읽기 작업에서는 당연히 가장 빠름. 그리고 멀티스레드 시 동기화 걱정을 할 필요가 없다.
'프로그래밍 > Java' 카테고리의 다른 글
Spring - JWT 연동 (0) | 2022.05.05 |
---|---|
Call By Referance / Call By Value (0) | 2022.05.05 |
접근제어자 정리 (0) | 2022.05.05 |
Java 특징 및 장점 (0) | 2022.05.05 |
JAVA encoding 예제 (0) | 2022.05.05 |