[Java] String 값 비교하기 (연산자 ==와 equals)

eunsil·2024년 5월 21일
0

Java

목록 보기
5/6
post-thumbnail

왜 String을 비교할 때는 == 이 아닌 equals()를 써야할까?


연산자 ==

두 문자열의 주소(참조)값이 같은 지 비교한다.
두 문자열이 메모리에서 동일한 위치를 가리키는 지 확인하는 것이다.



equals()


두 문자열이 동일한 을 가지는 지 확인한다.

문자열은 값을 비교해야 하므로 equals()를 사용하는 게 맞다!



객체의 주소값

문자열의 내용이 같아도 선언한 방식에 따라 주소값이 달라진다.

1) 리터럴 선언

String s1 = "Hello";
String s2 = "World";

문자열 리터럴을 사용하면, 자바 컴파일러는 String Constant Pool같은 값의 문자열을 공유해 값을 재사용하며 메모리 사용량을 최적화한다.
그래서, s1s2의 주소값은 동일하다.

2) new 연산자 선언

String s3 = new String("Hello");
String s4 = new String("World");

new 연산자로 문자열 객체를 생성하면 Runtime Data Area의 Heap에 저장돼 각각 다른 주소값을 할당 받는다.



String Constant Pool

Runtime Data Area의 Heap 메모리의 일부로 문자열 리터럴을 저장하는 메모리 영역이다.
문자열 처리 시 메모리 사용을 최적화하고 성능을 향상시키기 위해 사용된다.

1. 문자열 리터럴

  • Pool에 저장
  • 동일한 문자열 리터럴이 여러 번 사용될 경우, 동일한 메모리 주소를 참조해 객체 재사용 → 메모리 낭비 방지

2. 문자열 객체

  • Heap에 새로운 객체가 생성
  • Pool 사용 X

3. intern() 메서드

  • 문자열 객체를 풀에 추가하거나, 풀에 존재하는 객체를 반환

예제 코드

public class StringPoolExample {
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "Hello";
        String s3 = new String("Hello");
        String s4 = new String("Hello").intern();

        // s1과 s2는 같은 객체를 참조
        System.out.println(s1 == s2); // true

        // s1과 s3는 다른 객체를 참조
        System.out.println(s1 == s3); // false

        // s1과 s4는 같은 객체를 참조 (s4는 intern 메서드를 통해 상수 풀의 객체를 참조)
        System.out.println(s1 == s4); // true
    }
}

0개의 댓글