Programming Language/JAVA

[JAVA] String 메소드 4 - .equals()와 == 차이

Untitled_Blue 2023. 5. 6. 23:28
반응형

안녕하세요. 이번 글은 String 메소드인 .equals()와 연산자 ==의 차이점에 대한 설명입니다.

- .equals()

package classes;

public class Example {
    public static void main(String[] args) {
        String value01 = "JAVA Programming";
        String value02 = new String("JAVA Programming");

        if (value01.equals(value02)) { // 객체의 주소값이 아닌 내부의 값(문자열)을 비교
            System.out.println("value01 and value02 are equal");
        } else {
            System.out.println("not equal");
        }
    }
}
  • .equals(String str) : 비교할 문자열과 매개변수 문자열 str의 값 자체의 일치여부를 확인하는 메소드 (boolean 반환)

- .equals() vs == 차이점

package classes;

public class Example {
    public static void main(String[] args) {
        String value01 = "JAVA Programming";
        String value02 = new String("JAVA Programming");

        System.out.println();

        if (value01 == value02) { // 객체의 주소값의 일치 여부를 확인
            System.out.println("value01 == value02 : is equal");
        } else {
            System.out.println("value01 == value02 : not equal");
        }

        System.out.println("======================================");

        if (value01.equals(value02)) { // 객체의 주소값이 아닌 내부의 값(문자열)을 비교
            System.out.println("value01.equals(value02) : is equal");
        } else {
            System.out.println("value01.equals(value02) : not equal");
        }
    }
}

결과부터 말하면 첫 if문은 value01 == value02 : not equal이고 다음 if문은 value01.equals(value02) : is equal가 출력된다.

이제 이 둘의 차이점에 대해 알아보자. 일단 핵심은 주소값과 값 자체를 비교하냐의 차이다.

package classes;

public class Example {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        System.out.println(a == b); // false
        System.out.println(a == 10); // true

        char c = 'A';
        char d = 65;
        System.out.println(c == d); // true
        System.out.println(c == 'a'); // false
        
        // => 다음과 같이 기본자료형은 == 연산자로 일치여부 검사를 직관적으로 확인가능
    }
}

== 연산자는 메모리 구조 상 Stack 영역에 있는 데이터를 활용해서 일치여부를 확인한다. 이때 Stack 영역에는 기본 자료형은 값 자체가 변수와 함께 저장되지만 문자열 같은 참조 자료형은 객체를 위주로 하기 때문에 Heap영역의 주소값을 저장하고 있다. 아무리 두 문자열 값 자체는 같아도 new 키워드로 선언한 변수랑 단순대입 방식으로 선언한 변수와는 주소값 자체가 다르기 때문에 불일치하다는 결과를 보여준다.

반면 .equals() 메서드는 String 문자열의 값을 우선으로 하기 때문에 주소값이 아닌 변수 내부에 들어있는 값 자체를 위주로 일치여부를 확인한다.

 

그렇기 때문에 문자열의 일치여부를 활용해서 기능 내지 검사하는 과정을 구현한다면 .equals()를 활용하는 것이 좋다.

 

다음 글은 객체지향에 대한 설명입니다.

반응형