본문 바로가기

프로그래밍언어/Java

[Java 중급] String 클래스 - 비교

String 클래스 비교


String 클래스를 비교할 때는 항상 equals 비교를 해야한다. 

  • 동일성 : == 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는 지 확인
  • 동등성 : equals 메서드를 사용하여 두 객체가 논리적으로 같은지 확인
public class StringEqualsMain1 {
    public static void main(String[] args) {
        String str1 = new String("hello");
        String str2 = new String("hello");

        System.out.println("new String() == 비교: " + (str1 == str2));
        System.out.println("new String() equals 비교: " + str1.equals(str2));

        String str3 = "hello";
        String str4 = "hello";
        System.out.println("리터럴 == 비교: " + (str3 == str4));
        System.out.println("리터럴 equals 비교: " + str3.equals(str4));

    }
}

 

실행결과

 

=> str1 과 str2는 new String()을 사용해서 각각 인스턴스를 생성하므로 동일성(==) 비교에서 false가 나온다. 

그러나 내부의 값은 같은 'hello'를 가지고 있으므로 동등성(equals) 비교에 성공한다. 

 

리터럴은 왜 동일성 동등성 모두 true일까?

문자열 리터럴을 사용하는 경우에 자바는 메모리 효율성과 성능 최적화를 위해 문자열 풀을 사용한다. 자바가 실행되는 시점에 클래스에 문자열 리터럴이 있으면 인스턴스를 미리 생성한다. 이 때 같은 문자열이 있으면 만들지 않는다. str4의 경우 문자열 풀에서 str3과 같은 참조를 사용한다. 

문자열 풀 덕분에 같은 문자를 사용하는 경우 메모리 사용을 줄리고 문자를 만드는 시간도 줄어들기 때문에 성능도 최적화 할 수 있다. 

 

 

 

* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.