내가 파이썬만을 고집했다면 평생 들지 않았을 의문 중 하나이다.
왜 자바에서는 문자열을 비교할 때, equals() 메서드를 사용해야 하는가?
자바에서 문자열 비교 시, == 또는!= 연산자를 쓴다면 어떻게 되는가?
이에 대해 명쾌하게 답할 수 없다면 본 게시물을 읽을 가치가 있다.
String은 객체 타입인 '클래스'이다.
String str1 = new String("funczun");
String str2 = new String("funczun");
우선 클래스답게 문자열 두 개를 생성해보았다.
System.out.println(str1 == str2); // false
두 문자열을 == 연산자를 통해 비교하니 false가 출력되었다. 분명 str1, str2 모두 "funczun"으로 동일한데 false로 출력되는 이유가 궁금해진다.
== (!=) 연산자는 동일성을 비교하는 참조 비교 연산자다.
System.out.println(str1의 메모리 주소 == str2의 메모리 주소); // false
해당 연산자는 문자열의 경우 두 문자열이 동일한 메모리 주소를 가리키는지 비교하는 '참조 비교 연산자'이다. 쉽게 말해 두 문자열 객체가 같은 객체인지 확인한다. 따라서 담긴 값이 같더라도, 두 문자열은 엄연히 각각 다른 객체로 생성되었기 때문에 두 문자열이 같지 않다고 보는 것이다. (값을 저장하는 기본 자료형의 경우, 당연히 값을 비교하는 데 쓰인다.)
* 왜 실제 메모리 주소를 예시로 들지 않았나요?
자바에서는 객체의 실제 메모리 주소를 직접적으로 얻을 수 없다. 관련 내용은 다음 포스팅에서 다루겠다.
문자열 리터럴 비교 시, 동일한 객체로 취급된다.
String str3 = "funczun";
String str4 = "funczun";
일단 문자열 리터럴이라 함은 큰따옴표로 묶인 문자의 연속체이다. 자바에서는 이러한 문자열 리터럴에 대해 최적화 기능을 제공하는데, 이를테면 동일한 리터럴에 대해 동일한 객체를 참조하도록 한다.
System.out.println(str1 == str2); // true
자바의 특성으로 인해 참조 비교 연산자를 사용하였음에도 true가 출력되는 것을 확인할 수 있다.
equals() 메서드를 사용하면 동등성을 확인한다.
String str1 = new String("funczun");
String str2 = new String("funczun");
String str3 = "funczun";
String str4 = "funczun";
System.out.println(str1.equals(str2)); // true
System.out.println(str3.equals(str4)); // true
equals 메서드는 문자열이 논리적으로 동등한지 비교한다. 앞서 언급한 동일성이 자바 머신 기준 하에 메모리 참조를 비교하는 물리적인 방법이라면, 동등성은 인간이 생각하는 논리적인 기준에 맞추어 비교한다는 뜻이다. 중요한 점은 동등성이라는 개념 자체가 각각의 클래스마다 다르다는 것이며, String 클래스의 경우 문자열 내용이 그 기준 된다는 것이다.
'프로그래밍 > 배웠어, 자바' 카테고리의 다른 글
[Java] if 문, switch 문, 삼항 연산자 (0) | 2025.01.03 |
---|---|
[Java] 객체의 실제 메모리 주소 얻기 (0) | 2024.12.30 |
[Java] 주요 연산자 알아보기 (0) | 2024.12.23 |
[Java] 기본 변수 한 장 정리 (1) | 2024.12.20 |
[Java] 향상된 for 문 (0) | 2024.12.16 |