IT/Java

[Java] String 객체가 메모리에서 어떻게 관리되나요?

jaewon_sss 2024. 11. 7. 09:45
반응형

안녕하세요

오늘은 자바에서 많이 사용하는 String 객체에 대해, 메모리에서 어떻게 관리되고 비교하는지 알아보겠습니다.

이거 진짜 헷갈리잖아요?

자바는 문자열 처리를 위해 다양한 방법을 제공하는데요,

그 중에서도 String Constant Pool의 개념이 중요한 역할을 합니다.

이 개념을 이해하기 위해,

아래 예제 코드로 a, b, c가 어떻게 관리되는지 자세히 분석해 보겠습니다.

 

 


 

 

예제 코드

String a = new String("Hi");
String b = a;
String c = "Hi";

이 코드에서 a, b, c는 모두 "Hi"라는 값을 가지고 있습니다.

하지만 메모리에서 각각이 관리되는 방식에는 큰 차이가 있습니다.

하나씩 차이점을 알아볼까요?

 

 

 

1. String a = new String("Hi");

  • new 키워드를 사용하면 **힙 메모리(Heap Memory)**에 새로운 String 객체가 생성됩니다.

 

  • 자바는 문자열을 만들 때 String Constant Pool이라는 메모리 영역에 리터럴을 관리합니다. 하지만 new 키워드를 사용하면 이 Pool에 이미 "Hi"라는 문자열이 존재하더라도 무조건 새로운 객체가 힙 메모리에 생성됩니다.

 

  • 따라서, a는 힙 메모리에 새로 만들어진 "Hi" 객체를 참조하게 됩니다.

 

 

2. String b = a;

  • b는 a를 그대로 참조하도록 했기 때문에 b와 a는 동일한 객체를 참조하게 됩니다.

 

  • 즉, 힙 메모리에 생성된 같은 "Hi" 객체를 b와 a가 함께 가리킵니다.

 

  • 이 경우 a == b는 true입니다. 두 변수 모두 동일한 힙 메모리의 객체를 가리키고 있기 때문이죠.

 

 

3. String c = "Hi";

  • "Hi"를 리터럴 방식으로 선언하면, 자바는 String Constant Pool에 이미 "Hi"가 존재하는지 확인합니다.

 

  • "Hi"라는 리터럴이 String Constant Pool에 이미 존재한다면, c는 그 리터럴을 가리킵니다. 새로운 객체를 생성하지 않죠.

 

  • 따라서, c는 힙 메모리에 있는 a와는 다른 위치의 "Hi" 리터럴을 참조하게 됩니다. a == c는 false입니다.

 

 

결과 정리

이제 각각의 객체가 메모리에서 어떻게 다르게 관리되고 있는지 이해할 수 있을 것입니다.

세 변수를 정리하면 다음과 같습니다:

a new String("Hi") 힙 메모리의 새 "Hi" 객체
b a와 동일 참조 힙 메모리의 동일 "Hi" 객체
c "Hi" 리터럴 String Constant Pool의 "Hi" 객체

 

 

 

변수 간 비교 결과

  1. a == btrue
    • a와 b는 같은 힙 메모리의 "Hi" 객체를 참조하므로, == 비교에서 true를 반환합니다.

 

 

  1. a == cfalse
    • a는 힙 메모리에 생성된 객체를 참조하고, c는 String Constant Pool에 있는 리터럴을 참조하기 때문에 메모리 주소가 다릅니다.

 

 

 

  1. b == cfalse
    • b 역시 a와 동일하게 힙 메모리의 "Hi" 객체를 참조하기 때문에, c와의 주소 비교에서 false를 반환합니다.

 

 

 

  1. a.equals(b)와 a.equals(c)true
    • equals() 메서드는 문자열의 내용을 비교합니다. 따라서 a, b, c의 문자열 값이 모두 "Hi"로 같기 때문에 모두 true를 반환합니다.

 

 

 

결론

자바에서 String 객체는 리터럴 생성 방식과 new 생성 방식에 따라 메모리에서 다르게 관리됩니다.

String Constant Pool에 리터럴을 저장하여 메모리를 절약하고,

객체 생성 시 == 연산자를 통한 주소 비교와 equals()를 통한 값 비교의 차이를 이해하는 것이 중요합니다.

 

 

 

끗!

 

JAVA 개념 정리가 아직 명확하지않은 분들께서는 글의 내용이 잘 이해가 가지않을 수 있습니다!

저는 개념 정리가 부족했을때, 아래 책의 도움을 많이 받았어요!

https://link.coupang.com/a/bZo1oz

 

Java의 정석: 기초편 세트 - 프로그래밍 언어 | 쿠팡

현재 별점 4.8점, 리뷰 130개를 가진 Java의 정석: 기초편 세트! 지금 쿠팡에서 더 저렴하고 다양한 프로그래밍 언어 제품들을 확인해보세요.

www.coupang.com

 

 

 

 

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

 

반응형