스터디/CS

[CS] 자바 문자열 할당 방식

kwang2134 2025. 3. 27. 17:08
728x90
반응형
728x90

문자열을 리터럴로 할당하는 것과 객체로 할당하는 것의 차이는 new 키워드의 사용 여부로 구분할 수 있고 new 키워드의 사용 여부에 따라 메모리 할당과 객체 참조 방식이 달라짐

리터럴 할당

큰따옴표 안에 문자열을 직접 입력하는 방식

  • 메모리 저장 위치: 문자열 상수 풀(String Constant Pool) → 힙 영역의 일부
  • 객체 생성: 동일한 문자열 리터럴이 여러 번 사용되면 동일한 메모리 주소 참조
  • 비교: == 연산자를 사용한 비교 시 동일한 리터럴은 true 반환
String str1 = "리터럴 할당";
String str2 = "리터럴 할당";

System.out.println(str1 == str2); //true
  • 문자열 상수 풀은 메모리에서 문자열을 중복 저장하지 않도록 하여 메모리 효율을 높임
    • 처음으로 특정 문자열 리터럴이 사용되면 힙 영역의 문자열 상수 풀에 새로운 메모리 공간 할당
    • 동일한 문자열 리터럴이 다시 사용될 때 이미 존재하는 문자열 메모리 주소를 재사용
String str1 = "새로운 문자열"; //첫 번째 할당 -> 새로운 메모리 주소 -> 0xA 
String str2 = "새로운 문자열"; //두 번째 할당 -> 저장된 메모리 주소를 찾아 가리킴 -> 0xA

str1 == str2 // -> 같은 메모리 주소를 가리켜 true 반환

객체 할당

new 키워드를 사용해 문자열 객체를 생성하는 방식

  • 메모리 저장 위치: 힙 영역
  • 객체 생성: 동일한 문자열을 여러 번 생성해도 각자 다른 객체로 생성
  • 비교: == 비교 시 각자 다른 메모리 주소를 가리켜 false 반환
String str1 = new String("객체 할당"); // 메모리 주소 -> 0xA
String str2 = new String("객체 할당"); // 메모리 주소 -> 0xB

System.out.println(str1 == str2) //false

값 비교

  • equals 메서드를 사용해 참조 값 대신 실제 내용이 동일한지 비교
String str1 = new String("객체 할당"); // 실제 값 -> "객체 할당"
String str2 = new String("객체 할당"); // 실제 값 -> "객체 할당"

System.out.println(str1.equals(str2)) //true

비교

리터럴 할당 객체 할당

메모리 저장 위치 문자열 상수 풀(힙 영역) 힙 영역
객체 생성 동일한 문자열은 같은 메모리 주소 사용 객체 마다 다른 메모리 주소 사용
비교 값, 메모리 주소 비교 값 비교

정리

리터럴 할당이 객체 할당에 비해 메모리 효율성과 사용성이 높은 방법

728x90

'스터디 > CS' 카테고리의 다른 글

[CS] 자바의 final, finally, finalize  (0) 2025.04.04
[CS] Java String, StringBuilder, StringBuffer 차이  (0) 2025.03.28
[CS] 객체 지향 프로그래밍 특징  (0) 2025.03.26
[CS] Garbage Collection  (0) 2025.03.25
[CS] JVM 구조  (0) 2025.03.14