반응형

Java를 사용하다 보면 언제 equals를 사용해야 하고, 언제 ==를 사용해야 하는 지 헷갈리는 경우가 있다.

예시를 통해 차이점을 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.*;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws Exception {
        String a = "aaa";
        String b = a;
        String c = new String("aaa");
        String d = new String("aaa");
        System.out.println(System.identityHashCode(a));         //1627674070
        System.out.println(System.identityHashCode(b));         //1627674070
        System.out.println(System.identityHashCode(c));         //1360875712
        System.out.println(System.identityHashCode(d));         //1625635731
        System.out.println("========================");
        System.out.println("a == b : " + (a == b));             //True
        System.out.println("a == c : " + (a == c));             //False
        System.out.println("c == d : " + (c == d));             //False
        System.out.println("a.equals(b) : " + a.equals(b));     //True
        System.out.println("a.equals(c) : " + a.equals(c));     //True
        System.out.println("c.equals(d) : " + b.equals(d));     //True
    }
}
cs

위 코드를 실행한 결과값을 통해 다음과 같은 결론을 얻을 수 있다.

1. String a = "aaa" 와 String b = a는 같은 주소를 가르친다.

2. String c = new String("aaa")와 String d = new String("aaa")는 서로 다른 주소를 가르킨다.

3. == 연산은 같은 주소값인지를 비교한다. 즉, 안에 데이터는 비교하지 않는다.

4. equals 함수는 내부의 값을 비교한다.


여기서 4번 equals 함수 코드를 보면 구체적인 작동 방식을 알 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//String.java
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
cs

String에 구현된 equals 함수를 보면 length를 구해 while문으로 각 char 값을 비교하는 것을 확인할 수 있다.

반응형