Java의 문자열 처리 방식

상곤·2025년 4월 15일

Java

목록 보기
13/22
post-thumbnail
public class Main {
    public static void main(String[] args) {
        String str1 = "Java";
        String str2 = "Java";
        String str3 = new String("Java");

        System.out.println(str1 == str2);
        System.out.println(str1 == str3);
        System.out.println(str1.equals(str3));
        System.out.println(str2.equals(str3));
    }
}

이때 출력이 어떻게 될까?

나는 처음에 이렇게 예상했다.

false  
false  
true  
true

하지만 정답은 이렇다..🫠

true
false
true
true

문제에서 묻는 건 ==equals의 차이를 아느냐 였겠지만,
나는 Java가 문자열을 메모리에 어떻게 저장하는 지를 몰랐다.

Java를 처음 배울 때 배웠던 거 같긴 한데, 너무 오래돼서 까먹은 거 같다..

문자열 리터럴은 어디에 저장될까?

String str1 = "Java";
String str2 = "Java";

문자열 리터럴(변수에 대입하는 값)String Constant Pool(문자열 상수 풀)에 저장된다.

동일한 리터럴 문자열은 새로운 공간을 할당하지 않고,
기존에 있는 문자열 객체를 재사용한다.

즉, str1str2는 서로 다른 참조 변수지만
같은 객체의 주소를 가리킨다.

아래의 연산은 주소값을 비교하는 연산이기에 결과는 true가 나온다.

`System.out.println(str1 == str2);

반면에 new로 생성하면?

String str3 = new String("Java");

이렇게 new를 사용하면 항상 힙 영역에 새로운 객체를 만든다.

그래서 항상 다른 주소이기에 false가 결과로 출력되는 것이다.

equals

equals 연산은 문자열을 비교하는 것이기에 둘다 true가 출력된다.


정리하자면 이렇다

System.out.println(str1 == str2);  // true (같은 상수 풀 주소)
System.out.println(str1 == str3);  // false (힙에 새로 생성된 객체)
System.out.println(str1.equals(str3));  // true (값 비교)
System.out.println(str2.equals(str3));  // true (값 비교)

equals 와 == 는 알고리즘을 풀 떄도 많이 사용해서 익숙했는데,
자바의 메모리 구조와 참조 개념이 간만에 보니 생각이 안 났다~..

profile
🫠

0개의 댓글