Total Articles 494
C++ 개발자들이 Java 프로그램을 작성할 때 흔히 범할 수 있는 오류일 것 같아서 정리해 보았습니다. 뒤늦게 알아 버린 작동 원리에 눈물이 줄줄.... ㅠㅠ
[코드]
public class Test { public static void main(String[] args) { String a = "hello"; String b = "hello"; System.out.println(a == b ? "same" : "diff"); // (1) System.out.println(a.equals(b) ? "same" : "diff"); // (2)
a += "world"; b += "world"; System.out.println(a == b ? "same" : "diff"); // (3) System.out.println(a.equals(b) ? "same" : "diff"); // (4) } }
[수행결과]
same
same
diff
same
[분석]
Java에서 객체는 내부적으로 포인터로 관리가 된다.
(1) : a와 b는 같은 포인터를 가리키고 있다. true을 반환(a가 바라 보는 "hello"와 b에서 바라 보는 "hello"는 문자열이 같기 때문에 동일한 resource를 가리키게 됨).
(2) : a와 b의 문자열 내용이 같다. true를 반환.
(3) : a와 b 객체 각각에 "world"라는 문자열이 더해 지면서 서로 다른 객체(서로 다른 메모리를 차지)를 가리키게 된다(WOC 방식인 듯). 포인터가 다르므로 false를 반환.
(4) : a와 b의 문자열 내용이 같다. true를 반환.
[추신]
프로그램을 작성하다가 문자열 비교할 때 "=="사용하던 코드를 전부 "equals" 메소드를 사용하는 것으로 바꿈. "equals"보다가는 "==" 가 보기 좋은데... ㅠㅠ
Java에서는 operator overloading을 하지 못하는 것일까? ㅠㅠ
자바는 위원회에서 대판 싸우느라 언어 개선엔 관심이 없음...
문자열을 저런 병신같은 방법으로 처리하는 언어는 자바정도일듯 =_=