TIL 38 | [Java] 문자열(String)의 생성과 문자열의 비교 equals(), ==의 차이점

Yoonsik·2022년 9월 4일
1

JAVA

목록 보기
11/11

Java에서 문자열을 생성하는 방법과 문자열을 비교할때 equals() 메소드와 == 연산자의 차이점에 대해 알아보겠습니다.

문자열 생성

Java에서 문자열을 생성하는 방법은 String literal로 생성하는 방법new 연산자를 사용하여 생성하는 방법 2가지가 있습니다.

  • String literal 사용

String car1 = "Mercedes";
String car2 = "Mercedes";
  • new 연산자 사용

Stirng car3 = new String("BMW");
Stirng car4 = new String("BMW");
Stirng car5 = new Stirng("Mercedes");

이 두 방법은 결과적으로 큰따옴표 안에 있는 문자열이 생성되는 것은 같지만, 내부적으로 저장되는 위치가 다릅니다.

일단, 사용자가 생성한 String 객체이므로 두 문자열 모두 heap영역에 저장됩니다.

  • 이때, String literal을 사용한 문자열heap영역 내부에 존재하는 String Constant Pool에 저장되고,

  • new연산자를 사용한 문자열heap 내부에 저장됩니다.

결국 문자열 객체 car5와 car1은 "Mercedes"로 값은 같지만 저장되는 위치가 달라지게 됩니다.

위 그림처럼, String Pool에 저장된 문자열 객체는 똑같은 값을 또 생성해도 같은 위치에 있는 객체를 저장하게 됩니다.

반면, new 연산자를 사용해 새로운 객체를 생성할 경우, heap 내부에 새로운 객체를 만들어 저장하게 됩니다.


문자열 비교

생성된 문자열들을 == 연산자와 equals() 메소드를 이용하여 비교해 보고 차이점을 정리해 보겠습니다.

  • == 연산자를 사용

public class test1 {
    public static void main(String[] args) {
        String car1 = "Mercedes";
        String car2 = "Mercedes";

        String car3 = new String("BMW");
        String car4 = new String("BMW");
        String car5 = new String("Mercedes");

        if (car1 == car2) {
            System.out.println("car1 == car2");
        }
        else {
            System.out.println("{car1 != car2");
        }

        if (car1 == car5) {
            System.out.println("car1 == car5");
        }
        else {
            System.out.println("car1 != car5");
        }
    }
}


위 코드를 실행해보면, 다음과 같은 결과가 나오는 것을 알 수 있습니다.
이때, car1과 car5는 "Mercedes"로 값이 같은데도 조건문이 False를 반환합니다. 그 이유는, == 연산자에 있습니다.

== 연산자는 해당 문자열의 값이 아닌 주소를 비교합니다. 따라서, car1과 car2는 같은 주소에 있는 문자열의 값을 갖고 있기 때문에 비교했을때 True를 반환하지만,

car1과 car5는 같은 문자열임에도 불구하고 다른 위치에 있는 문자열 값을 가지고 있으므로, 문자열의 주소를 기준으로 비교하는 == 연산자의 입장에서는 False를 반환하게 됩니다.

이러한 상황에서 문자열의 주소가 아닌 값이 같은지 비교하기 위해서는 equals() 메소드를 사용해야 합니다.

  • equals() 메소드 사용

    equals() 메소드는 주소를 비교하는 == 연산자와 달리, 문자 하나하나를 비교하여 값이 같으면 True를 반환합니다.
public class test2 {
    public static void main(String[] args) {
        String car1 = "Mercedes";
        String car2 = "Mercedes";

        String car3 = new String("BMW");
        String car4 = new String("BMW");
        String car5 = new String("Mercedes");

        if (car1.equals(car2)) {
            System.out.println("car1 == car2");
        }
        else {
            System.out.println("car1 != car2");
        }

        if (car1.equals(car5)) {
            System.out.println("car1 == car5");
        }
        else {
            System.out.println("car1 != car5");
        }
    }
}

위 코드를 실행해보면 다음과 같은 결과가 나오는 것을 알 수 있습니다.
위에서 설명하였듯이, equals() 메소드는 주소를 비교하는 == 연산자와 달리, 문자 하나하나를 비교하기 때문에 car1과 car5를 같다고 판단합니다.
따라서 car1 == car5 를 출력합니다.


profile
꾸준함의 힘

0개의 댓글