수업을 듣다가 String 이 immutable 객체라는 사실을 알게 되어 정리하고자 글을 쓴다.
시작하기 전에
모든 객체들은 힙(heap)에 저장된다.
이부분을 한번더 되새기고 지나간다.
은 한번 생성되면 절대로 그 값이 변하지 않는다.
여기서 의문이 들었다. 어? 잘나오는데?
String apple = "green";
System.out.println(apple);
apple = "red";
System.out.println(apple);
결과
green
red
사실 내부적으로는 최초에 생성된 String 객체의 값이 변경되는 것이 아닌 새로운 객체가 생성되며 변수 apple 이 그 새로운 객체를 참조하게 되는 것이다.
기존의 "green" 과 "red" 두개의 객체는 모두 heap에 존재한다.
처음 String apple = "green"; 했을때에는 참조변수 apple 이 xx주소를 가리키지만
apple = "red"; 재할당을 하면 yy주소에 객체가 생성되고 apple 은 yy주소를 가리키게 된다.
저렇게 사용되지 않는 힙메모리 안의 객체는 garbage Collector가 와서 처리해준다.
String a = "A";
for(int i = 0 ; i < 1000000; i++){
a += "B";
}
a+= "C";
System.out.println(a);
위의 코드를 실행시킬경우 인식이 가능할정도로 느리게 처리된다. 글쓴이의 경우에는 거의 10초 가량 걸렸다.
String 은 불변이기 때문에 힙에 새로운 객체가 1000000번 생기고 나머지는 garbage collector이 가져가는 시간이 걸리기 때문이다.
heap, String 에대해 어제보다 더 이해하게 되었다.