티스토리 뷰

수업 노트/java (이론)

String 객체의 원리(2)

오리지날초이 2021. 8. 24. 11:22

이전글에서 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 에 대한 코드를 추가해 줍시다.

 

이전 코드 실행결과를 포함한 최종 실행결과는 다음과 같습니다.

드래그 부분이 str0 와 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과 리터럴에 대해 설명하다가 예상과 다른 결과가 나와서 여기까지 확인하게 되었네요.

그냥 궁금증 탐구 차원 정도로 받아들이시면 될 것 같습니다.

이해를 돕기 위한 전체 코드와 결과입니다.

 

 

728x90
반응형

'수업 노트 > java (이론)' 카테고리의 다른 글

java static 쉬운 설명  (0) 2021.08.31
for each 사용법  (0) 2021.08.24
String 객체의 원리(1)  (2) 2021.08.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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
글 보관함