자바에서 String은 mutable이야? immutable이야?
친구의 질문으로 시작된 게시글!
mutable: 변할 수 있는; 잘 변하는
immutable: 변경할 수 없는, 불변의
사전적 정의로 보면 이런 뜻을 가지고 있다.
그리고 나는 단순하게 이렇게 생각했다.
1 | String userName = "홍길동"; |
값이 변하는데? 그럼 mutable아니야?
응 아니야.
여기서 변할 수 있다, 없다의 기준은 우리가 눈으로 보는 String 값이 아니다.
우리가 위와 같은 행동을 했을 때는 참조하고 있던 값을 변경하는 것이 아니라 새로운 객체를 재할당 받는 것이다.
[JAVA] 문자열 붙이는 방식의 차이(concat, +, StringBuilder)
마침 바로 이전글을 참고해보면 알 수 있는 정보가 있다!
immutable한 String, mutable한 StringBuilder
String 문자열을 이어붙일 때 concat을 쓰면 새 주소값이 생기는 것을 확인했었다.1
2String result = "Hello";
result = result.concat("World");
주소 | 값 |
---|---|
1000 | Hello |
2000 | HelloWorld |
이유는 concat할때마다 new String()
으로 새로운 객체를 만들어 할당받기 때문!
굳이 문자열 붙이는 작업이 아니라 첫번째 언급했던 코드 대로 본다면
새로운 주소값을 가지고 있는 객체를 userName
변수에 재할당 하는 것이다.
주소 | 값 |
---|---|
1000 | 홍길동 |
2000 | 둘리 |
- userName에 홍길동 값을 가지고 있는 1000번 주소를 할당
- 값이 변경되면 1000번을 가리키고 있던 것을 새로운 객체가 있는 2000번으로 변경!
반면에 StringBuilder는 append로 객체를 이어붙여 주소값이 변경되지 않는다.1
2
3StringBuilder result = new StringBuilder();
result.append("Hello");
result.append("World");
주소 | 값 |
---|---|
1000 | Hello |
1000 | HelloWorld |
immutable한 클래스는 어떤게 있나요?
String, Boolean, Integer, Float, Long 등이 있습니다.
immutable한 클래스를 만들어 봅시다
immutable은 값을 변경할 수 없는 클래스를 뜻한다. 즉 set 메소드가 없다!
또한 final 키워드를 사용해 변수 초기화 이후 바뀌지 않도록 막는다.1
2
3
4
5
6
7
8
9
10
11
12
13
14public class ImmutableTest {
private final String userName;
ImmutableTest(String userName){
this.userName = userName;
}
public String toString(){
return this.userName;
}
}
1 | String userName = "홍길동"; |
결과 값은 immutable로 만들었던 userName(홍길동)은 변하지 않고, 새로운 객체 둘리가 userName에 할당된다.
참고사이트
http://hashcode.co.kr/questions/727/자바에서-immutable이-뭔가요
http://limkydev.tistory.com/68