정보처리기사 23년 2회 실기 시험에 다음과 같은 문제가 나왔습니다.
String str1 = 'Programming';
String str2 = 'Programming';
String str3 = new String('Programming');
println(str1==str2)
println(str1==str3)
println(str1.equals(str3))
print(str2.equals(str3))
정답은
true
false
true
true가 됩니다.
1. Java에는 primitive 타입(int, boolean, char, double, float, byte, short, long 등)과, reference 타입(String, Arrays, Collection Framework, 등) 두 가지가 있는데 String은 reference 타입이므로, 주솟값은 stack에 생성되고 실제 값은 heap에 저장됩니다. (primitive 타입은 stack에 값을 직접 저장)
2. 그런데 자바에서는 효율적인 메모리 관리를 위해 heap 영역에 "문자열 풀"이라는 것이 존재합니다.
3. 그래서 위 코드에서 String str1 = "Programming"; 에서 "Programming"은 처음으로 heap 영역의 문자열 풀에 저장되게 됩니다. 그리고 String str2 = "Programming"; 에서 "Programming"은 이미 문자열 풀에 있기 때문에, str2는 이전에 생성된 문자열 풀의 "Programming"을 가리키게 됩니다. 그래서 str1==str2는 true가 되게 됩니다.
4. new 키워드를 통해 생성된 문자열은 heap 영역의 문자열 풀이 아닌, heap 영역에 생성되게 됩니다.
참고
[Java]문자열 상수 풀(String Constant Pool)이란?
문자열 상수 풀(String Constant Pool) Java는 문자열 상수 풀 또는 문자열 풀이라고 불리는 특수한 저장 공간을 가지고 있습니다. 문자열 상수 풀은 Java의 힙 영역에 존재하는 특수한 공간으로 문자열
developer-talk.tistory.com
'개발 > Java' 카테고리의 다른 글
[Java] Mac M1 Java 환경변수 설정 (0) | 2022.11.06 |
---|---|
[Java] interface & abstract class 차이 (0) | 2022.07.23 |
[Java] 다형성 (0) | 2022.02.04 |
[Java] 메소드 오버로딩 (0) | 2022.01.21 |
[Java] 메소드 오버라이딩 (0) | 2022.01.21 |