Java equals()와 == 의 차이점

Updated:

equals() 메소드는 비교자하는 대상의 내용 자체를 비교하지만, == 연산자는 비교하고자 하는 대상의 주소값을 비교합니다.

예를들어, String 클래스를 이용한 문자열을 만들어 볼게요.

String aString = "Hello World";
String bString = aString;
String cString = new String("Hello World");

aString, bString, cString, 을 각각 비교해 보겠습니다.

Example

public class Test {
    public static void main (String[] args){

        String aString = "Hello World";
        String bString = aString;
        String cString = new String("Hello World");

        System.out.println("aString.equals(bString) : " + aString.equals(bString));
        System.out.println("aString.equals(cString) : " + aString.equals(cString));
        System.out.println("bString.equals(cString) : " + bString.equals(cString));
        System.out.println("aString == bString : " + (aString == bString));
        System.out.println("aString == cString : " + (aString == cString));
        System.out.println("bString == cString : " + (bString == cString));
    }
}

Result

aString.equals(bString) : true
aString.equals(cString) : true
bString.equals(cString) : true
aString == bString : true
aString == cString : false
bString == cString : false

주소값을 비교하는 == 연산자에서 aStringbString은 서로 같지만 cString과는 다르다고 출력이 되었습니다.

왜냐하면 cString 은 new 연산자를 통해서 만들어 졌기 때문입니다. 이를 간단한 그림으로 표현하자면 아래와 같습니다.

image

위와같은 결과가 나온 이유는 Java의 JVM 때문입니다. JVM의 메모리는 여러 구역으로 나뉘어져있습니다. 그 중 Constant Pool, Heap 영역이 존재합니다.

aString처럼 리터럴로 선언할 경우, “Hello World”라는 값은 Constant Pool에 저장됩니다. 이후에 또 bString과 같이 리터럴로 선언하면, 일단 자바는 Constant Pool에서 bString의 값인 “Hello World”를 찾습니다.

만약 존재하면 bString를 따로 저장하는게 아니라, 기존에 저장된 “Hello World”객체를 참조합니다. 즉, aStringbString는 완전 똑같은 객체입니다. 그래서 aString == bString 조차도 주소값이 같으므로 true가 나옵니다.

cString처럼 new를 이용해 선언하면 이 String객체는 Heap영역에 저장됩니다. 즉, Constant Pool에 저장된 aString, bString와는 주소값이 다릅니다. 그래서 aString != cString 이 됩니다.

Leave a comment