String ABC="";
ABC="GANA";
if(ABC=="GANA) <- 이건 성립하지만
return true;
String ABC= "";
ABC=ABC+"GANA";
if(ABC=="GANA) <- 이꼴이 성립이 안되네요.
return true;
두 ABC모두 출력은 GANA로 나오는데요.
왜 이럴까요...?
하이레벨에서만 코드를 보면 이해가 안되겠지만, 우선 "GANA" 상수값 는 Global영역에 메모리가 할당되고 그것의 레퍼런스를 ABC에 할당하게됩니다. String는 수정 불가능 객체입니다. 뭔가 새로운값을 할당하면 그것은 기존 레퍼런스를 수정하는것이 아니라. 새로운것을 할당하는 의미가 됩니다. 즉 String ABC=""; 문장은 다음줄 ABC="GANA"; 에 의해 완전히 대체됩니다. 그다음 문장 if( ABC=="GANA" )에서 "GANA"는 동일 한 영역( 같은 레벨의 {} 속 )에 있는 상수값은 ABC에 할당했던 "GANA"와 동일한 레퍼런스입니다. 따라사 if( ABC == "GANA" ) 는 true가 성립하겠죠. 하지만 그다음에 있는 ABC=ABC+"GANA"를 하면 ABC에는 전혀 새로운 String객체가 생성되어 할당되게됩니다. 따라서 그다음의 if( ABC =="GANA" )는 ABC와 "GANA"가 다른 객체를 가르키고 있기 때문에 false입니다. 물론 값을 비교하는 ABC.equal( "GANA" )로 했다면 true 겠죠. 요약하자면 String은 Value가 아니라 Object이고 Object에서 == 비교는 동일한 Object를 가르키고 있느냐를 비교하는것이지, 그것이 담고 있는 값을 비교하는게 아니라는걸 아는게 중요합니다.