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 |