티스토리 뷰
이전글에서 String 객체내부에서 처리되는 value 값과
객체 자체의 주소값, 문자열 리터럴의 주소값 개념에 대해 살펴보았습니다.
살펴본김에 아래 코드를 추가하고 약간만 더 살펴봅시다.
최초 문자열 "Hello" 에 문자열을 추가해서 "Hello world" 를 만들면
기존의 리터럴 "Hello world" 와는 어떤 차이가 있을까요?
String str01 에 할당된 "Hello" 와 추가로 " world" 문자열을 덧붙여 생성된 "Hello world" 를 비교해보면
"Hello" 와 "Hello world" 는 별도의 리터럴을 참조하는 객체임을 알 수 있습니다.
재밌는건 str0 에서 참조하는 "Hello world" 와
일반 리터럴 "Hello world" 는 서로 다른 주소값서 생성되는걸 확인할 수 있네요.
이는 일반 리터럴은 java heap 영역의 String Constant Pool 영역에서 생성되는
일종의 공통 상수로 다뤄지기 때문입니다.
각 객체에서 최초 생성하는 "Hello" 와 추가적으로 문자열이 결합된 "Hello world" 는 어떤 차이가 있을까요?
비교를 위해 String str01 에 대한 코드를 추가해 줍시다.
이전 코드 실행결과를 포함한 최종 실행결과는 다음과 같습니다.
이전에 str1, str2, str3, str4 를 통해 확인했듯
str0 와 str01 의 최초 참조 문자열은 동일한 리터럴 "Hello" 를 참조합니다.
다만 이번에 눈여겨 볼 부분은
str0 += " world";
str01 += " world"; 를 실행하고 난 결과입니다.
str0 와 str01 은 일반적으로 사용하던 리터럴 "hello world" 와도 다른 객체값을 참조하고
또 서로간에도 다른 주소값(str0 : 834600351, str01 : 471910020) 을 참조하게 되네요
그 와중에 일반 리터럴 "Hello world" 의 주소값은 꾸준히 동일한 값을 표기하고 있습니다.
최초 문자열 생성은 리터럴을 참조하지만
객체 내부의 문자열이 변환되면 공통 리터럴을 참조하는게 아니라
객체 내부의 별도 value 로 관리됨을 확인할 수 있습니다.
사실 기억해야할 것은 String 의 값이 변환되면 객체단위로 새로운 String 을 참조해서 사용한다.
기존의 String 이 그대로 유지되는 것이 아니다 정도입니다.
저도 수업 때 Stirng과 리터럴에 대해 설명하다가 예상과 다른 결과가 나와서 여기까지 확인하게 되었네요.
그냥 궁금증 탐구 차원 정도로 받아들이시면 될 것 같습니다.
'수업 노트 > java (이론)' 카테고리의 다른 글
java static 쉬운 설명 (0) | 2021.08.31 |
---|---|
for each 사용법 (0) | 2021.08.24 |
String 객체의 원리(1) (2) | 2021.08.23 |
- Total
- Today
- Yesterday
- Strings
- over the wire
- ssh
- SSL
- tar
- natas7
- bz2
- gz
- Natas
- 리눅스
- OpenSSL
- Bandit
- 32bit
- Linux
- OverTheWire
- 풀이
- java
- BASE64
- HTTPS
- 리터럴
- tr
- grep
- X32
- 압축파일
- 웹보안
- Encode
- 웹보안공부
- solution
- find
- nc
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |