우리가 보통 비교를 할 때 == 를 많이 쓴다.
그러나 코테 문제를 풀다 보면 문자열을 비교하는 과정에서 별 생각 없이 == 을 썻다가 틀린 경험이 있을 것이다.
그렇다면 == 과 .equals()는 어떤 차이가 있기 때문에 다음과 같은 경우가 발생한 것일까?
1. 동작 방식에서의 차이
| 비교 방식 | 비교 대상 | 설명 |
| == | 주소값 (Memory Address) | 두 변수가 완전히 동일한 객체(메모리 위치)를 가리키는지 확인 |
| .equals() | 내용 (Content) | 두 변수가 가리키는 문자열의 실제 값(텍스트)이 같은지 확인 |
잘 이해가 안된다면 코드 예시를 봐보자.
아래 코드 예시는 프로그래머스 연습 문제를 풀면서 내가 작성한 코드이다.
class Solution {
public int solution(String[] s1, String[] s2) {
int answer = 0;
for(int i = 0; i < s1.length; i++) {
for(int j = 0; j < s2.length; j++) {
if(s1[i].equals(s2[j])) { // <- 여기서 만약 s1[i] == s2[j]로 썻다면??
answer++;
}
}
}
return answer;
}
}
지금은 .equals()를 쓰면서 문제를 풀었지만 만약 주석대로 s1[i] == s2[j] 로 비교를 했다면 어떤 일이 일어날까?
아마 if문 자체에 걸릴 일이 없기 때문에 answer++은 절대 일어나지 않을 것이다.
왜일까?
2. 메모리 관점에서 과연 같을까?
우리가 봤을 때 s1[i] == s2[j] 이렇게 코드를 작성한다면 s1의 문자와 s2의 문자가 같으면 if 문이 돌아야 하는거 아닌가? 라고 생각이 든다.
근데 그건 우리 생각이다.
아까 위에서 표로 정리한 내용을 다시 봐보자.
== 연산은 두 변수가 완전히 동일한 객체(메모리 위치)를 가리키는지 확인 이라고 하였다.
결국 == 연산은 s1과 s2가 생긴 모습이 같더라도 저장된 위치가 다르다면 같은 값으로 보지 않는다.
좀 더 구체적으로 예시를 들어보면
- s1[i] ("안녕"): 메모리 주소 100번지에 저장됨
- s2[j] ("안녕"): 메모리 주소 500번지에 저장됨
이때 코드를 실행하면
- if (s1[i] == s2[j])
- 컴퓨터: 100번지랑 500번지가 같은 숫자인가?
- 결과: False (다름) answer가 증가하지 않음
- if (s1[i].equals(s2[j]))
- 컴퓨터: "100번지에 있는 글자랑 500번지에 있는 글자가 똑같이 생겼나?"
- 결과: True (둘 다 "안녕"임) answer 증가함
결국에는
- equals(): 두 집에 사는 사람이 똑같이 생겼는지(쌍둥이인지) 확인하는 것 (내용 비교)
- ==: 두 사람이 같은 주소(같은 집)에 사는지 확인하는 것 (주소 비교)
결국 우리가 하고 싶었던 것은 내용 비교 였는데 ==을 써서 주소 비교를 해두고 왜 내용이 같은데 틀렸다고 하는거야? 라고 하는 것이다.
대부분의 코테에서 문자열 비교를 하게 된다면 . equals()를 사용하면 된다.
'tech > JAVA' 카테고리의 다른 글
| [JAVA] 두 문자열을 비교하여 포함 여부를 확인하는 방법 (0) | 2025.12.20 |
|---|