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을 하지 못하는 것일까? ㅠㅠ