티스토리 뷰
public class HelloWorld {
public static void main(String[] args) {
String str1 = "hello";
String str2 = new String("hello");
String str3 = new String("hello");
}
}
위 코드에서 str1처럼 바로 " "을 통해 문자열을 선언하면 heap에 있는 String constant pool에 "hello"라는 문자열이 있는지 탐색하고 없을 경우 생성하지만 이미 존재한다면 해당 문자열을 참조한다.
str2의 경우 str1과 같이 "hello"라는 문자열을 string constant pool에서 찾고 없다면 새로 만드는 과정은 동일하지만 추가적으로 string pool이 아닌 heap메모리에 문자열 객체를 새로 생성한다.
따라서 위 코드와 같이 문자열 두개를 선언하면 string pool에 1개, heap에 2개의 문자열 객체가 생성되어 총 3개의 문자열 객체가 생성된다. 레퍼런스 비교 연산인 ==을 수행하면 세 변수 모두 다른 값을 가질 것이다.
public class HelloWorld {
public static void main(String[] args) {
String str2 = new String("hello");
String str3 = new String("hello");
}
}
위와 같이 new String을 통해 문자열 객체를 생성하면 메모리에는 총 3개의 문자열 객체가 존재하게 된다. 우선 string pool에 한 개, heap에 두 개의 문자열 객체가 존재하게 된다.
[테스트결과]
- String의 hashCode()는 각 자리수의 아스키코드 값의 31의 승수의 합으로 표현되기 때문에 메모리상 위치가 아닌, 문자열의 내용을 활용한다. (참고: https://jh-labs.tistory.com/173)
- == 연산은 reference 비교이기 때문에 서로 다른 객체가 생성되었음을 알 수 있다.
- String의 equals() 역시 hashCode() 기반으로 동작하도록 override되었기 때문에 == 연산이 아닌 문자열 내용을 비교한다.
Reference
'[ 백엔드 개발 ] > [ Java,Kotlin ]' 카테고리의 다른 글
[java] 가비지 컬렉션(GC) 기본개념 (0) | 2021.09.15 |
---|---|
<추천글>[java] Runtime Data Areas (JVM 메모리 구조) (0) | 2021.08.24 |
[java] 자바 실행 과정 deep dive (0) | 2021.08.24 |
[java] interface의 진짜 목적 (0) | 2021.08.04 |
<추천글>[JAVA] 개발하면서 알아야할 기본사항1 (0) | 2021.08.04 |
- Total
- Today
- Yesterday
- spring
- ci/cd
- Kubernetes
- Kotlin
- github actions
- 코틀린
- GitOps
- RDB
- container
- 우분투
- golang
- K8s
- LFCS
- docker
- Controller
- 카프카
- Linux
- Stream
- CICD
- rolling update
- jvm
- 컨트롤러
- 쿠버네티스
- go
- ubuntu
- kafka
- Java
- Non-Blocking
- argocd
- db
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |