[Java] 3. String 비교 및 메모리 구조

김민주·2025년 3월 22일

Programming Language

목록 보기
7/12
post-thumbnail

💬 시작하기 전에

자바에서 가장 많이 하는 실수 중 하나가 바로 String 비교다.
==를 쓰면 안 되는지, 왜 equals()를 써야 하는지 헷갈린 적 있지?
그 이유는 바로 "메모리 구조"와 관련 있다.

📌 자바의 String은 특이하다 - "String Pool"이라는 공간이 있다

자바는 "abc"처럼 리터럴로 선언한 String을 JVM 내부 String Pool에 저장한다.
같은 리터럴이 나오면 새로 만들지 않고 기존 Pool의 값을 재사용한다.

String strA = "abc";
String strC = "abc";
System.out.println(strA == strC);  // true

✔️ 둘 다 "abc"라는 같은 리터럴이기 때문에 같은 주소를 가리킨다.

📌 그런데 new String("abc")는 다르다?

new String()을 쓰면 Heap 메모리에 새로운 객체를 무조건 생성한다.
Pool에 같은 값이 있어도 상관없이 새로 만들어서 다른 주소를 가진다.

String strA = "abc";
String strB = new String("abc");
System.out.println(strA == strB);  // false

✔️ 값은 같아도 메모리 주소가 다르기 때문!

📌 예시 코드

String strA = "abc";
String strB = new String("abc");
String strC = "abc";
String strD = new String("abc");

System.out.println(strA == strB); // false (리터럴 vs new 객체)
System.out.println(strA == strC); // true  (같은 리터럴 → 같은 주소)
System.out.println(strB == strD); // false (new 객체끼리는 서로 다른 주소)

📌 그림으로 보면 더 쉬움


"abc" 리터럴 → String Pool에 1개만 생성
new String("abc") → Heap 메모리에 각각 따로 생성

✅ 그래서 결론: == 말고 반드시 equals() 써라

비교 방법설명결과
==주소 비교 (레퍼런스 비교)같아도 false 가능
equals()실제 문자열 값 비교값이 같으면 무조건 true
System.out.println(strA.equals(strB));  // ✅ true (값 비교)

💬 외워야 할 핵심 2줄

"abc"처럼 리터럴은 String Pool 공유
new String("abc")는 Heap에 새로 생성
String 비교는 무조건 equals()로!

🎯 Mini Quiz

아래 코드를 실행했을 때 출력 결과는?

String str1 = "hello";
String str2 = new String("hello");
String str3 = "hello";

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

✍️ 정답
🙅‍♀️ str1 == str2 → false
"hello"는 String Pool, new String("hello")는 Heap에서 따로 생성
주소가 다르다!

🙆‍♀️ str1 == str3 → true
둘 다 리터럴 "hello" → String Pool에서 같은 주소

🙆‍♀️ str1.equals(str2) → true
값 비교니까 "hello" == "hello" → true

profile
낭비하지마 네 시간은 은행🐰

0개의 댓글