A) String s = new String("abc");
B) String s = "abc";
- B와 A는 같습니다.
- 원래 A처럼 써야 하는데, 워낙 사용빈도가 많아서 B처럼 써도 컴파일러가 알아서 A처럼 바꿔서 컴파일 합니다.
- 메모리는 Stack Memory와 Heap Memory가 있는데요. Stack에는 주소값(Address)만 저장이 됩니다.(앗! 주소값 이외에 int/byte 등 약속된 타입은 저장이 되는 군요)
- new String("abc"); 하면 Head메모리에 String객체가 생성되고, 그 객체에는 'abc'를 갖게 됩니다.
- '='기호는 Assign Operator(맞나?^^;;)이라고 하며, '='표시 우측의 값을 왼쪽에 넣는 행동을 하게 됩니다.
- 따라서 Heap에 생성된 String("abc");의 주소값(Address)을 Stack 영역의 's'에 넣는 겁니다.
녹색글자를 보면,
String s=new String(); >> new String(); 해서 값이 없는 String객체의 주소값을 's'에 넣고
s="abc"; >> "abc"값을 갖는 String객체를 Heap에 또 만들어서 그의 주소값을 's'에 넣은 거지요
따라서, Heap에는 객체가 2개 존재하고 (new String(); 그리고 new String("abc") ) 's'에는 두번째 녀석의 Address가 입력 됩니다.(메모리 낭비지요)
그럼 HEAP에 남아 있는 new String(); 객체는... 잠시 후에... 가비지 콜렉터가 지워주게 되는데.. 이때 메모리도 반환이 됩니다.
(가비지 컬랙터의 삭제 조건은... if (Head의 메모리값이 Stack에 없으면) 삭제를 합니다.)