개발 여정/Java
equals와 ==의 차이 (feat. 프로그래머스 마라톤 완주 문제)
calm-lee
2021. 10. 11. 21:16
프로그래머스 '마라톤 완주하지 못한 문제'를 풀다가
다음과 같은 해설을 접했다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
int i; // (3) 때문에 전역변수로 선언
// (1) 각 배열을 오름차순으로 정렬
Arrays.sort(participant); // {"leo", "kiki", "eden"}; => {eden, kiki, leo}
Arrays.sort(completion); // {"eden", "kiki"}; => {eden, kiki}
// (2) completion만큼 for문 돌리고, 서로 일치하지 않는 경우 해당 participant[i] 리턴
for (i = 0; i < completion.length; i++) {
if (!participant[i].equals(completion[i])) {
return participant[i];
}
// i++로 인해 i == comletion.length (= participant.length-1)
}
return participant[i]; // (3) participant 배열의 가장 마지막에 있는 경우
}
}
위 코드에서 if문의 !participant[i].equals(completion[i])을
participant[i] != completion[i] 로 바꿨더니 제대로 작동하지 않았다.
원인
== 는 object의 주소값을 비교하기 위한 것이고,
equals는 대상의 내용 자체를 비교한다.
CBV(Call By Value)는 주소값을 할당받지 않지만(int, float, double, byte 등의 primitive type)
CBR(Call By Reference)는 주소값을 할당받는다.(Class, Object)
String은 Object이기 때문에 주소값을 가지며 배열의 위치를 sort해도 이는 변하지 않는다.
따라서 == 연산자로 비교했을 때 같은 스펠링이더라도 같지 않다고 나오는 것이다.
String의 내용이 같은지 비교할 때는 equals()를 사용해야 한다.
참고 블로그: