tech/JAVA

[JAVA] 문자열 비교 == 연산자와 .equals()의 차이

sunm2n 2025. 12. 14. 19:47

우리가 보통 비교를 할 때 == 를 많이 쓴다.

 

그러나 코테 문제를 풀다 보면 문자열을 비교하는 과정에서 별 생각 없이 == 을 썻다가 틀린 경험이 있을 것이다.

 

그렇다면 == 과 .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번지에 저장됨

이때 코드를 실행하면

  1. if (s1[i] == s2[j])
    • 컴퓨터: 100번지랑 500번지가 같은 숫자인가?
    • 결과: False (다름)  answer가 증가하지 않음
  2. if (s1[i].equals(s2[j]))
    • 컴퓨터: "100번지에 있는 글자랑 500번지에 있는 글자가 똑같이 생겼나?"
    • 결과: True (둘 다 "안녕"임) answer 증가함

결국에는

 

  • equals(): 두 집에 사는 사람이 똑같이 생겼는지(쌍둥이인지) 확인하는 것 (내용 비교)
  • ==: 두 사람이 같은 주소(같은 집)에 사는지 확인하는 것 (주소 비교)

결국 우리가 하고 싶었던 것은 내용 비교 였는데 ==을 써서 주소 비교를 해두고 왜 내용이 같은데 틀렸다고 하는거야? 라고 하는 것이다.

 

대부분의 코테에서 문자열 비교를 하게 된다면 . equals()를 사용하면 된다.