티스토리 뷰

JAVA

[JAVA] - String이란?

김종현 2021. 5. 4. 17:02

JAVA로 개발하다보면 제일많이 쓰이는 클래스가 String 클래스인것같다. 이번장에서는 String에 대해 알아보자

String이란?

String 클래스는 문자열을 다루는 클래스이며 immutable 하다는 특징이 있다. immutable은 한국어로 해석하면

불변이라는 단어인데 String 객체에 값이 초기에 할당되면 그 값은 변경되지 않는다.

String 객체 생성방법

String 객체는 생성하기위해 2가지방식이 있다. 리터럴을 이용한 방법과 new연산자를 이용한 방법이 있다.

 

리터털로 생성하게되면 String 객체는 String Constant Pool이란 공간에 저장이되며 new연산자를 이용해 생성하면

Heap영역에 생성된다. 그리고 각 변수 a1, a2는 Stack 메모리에 올라가며 String Constant Pool과 Heap영역에 생성된 객체 메모리 주소값을 참조하게 된다.

 

변수 a1와 a2는 서로 참조하는곳이 다르기때문에 false가 나오게 된다.

String 연산

String은 불변하다는 특징이 있다고 했다. 초기에 'a1'라는 변수에 'a' 라는 리터럴로 String 객체를 생성후
생성된 객체에 'a' 라는 리터럴을 한번더 연산했다.


String Constant Pool에는 두개의 String 객체가 생성된 것 처럼 보이겠지만 그렇지 않다.
위의 소스코드의 실행흐름은 다음과 같다.

1. 'a1'라는 변수에 'a' 라는 리터럴을 이용해 String 객체를 생성한다.
2. 'a1'라는 변수에 'a' 라는 리터럴을 추가로 연산진행 
3. 기존에 String Constant Pool에 있던 'a'와 2에서 추가한 'a'가 연산이 되면서 'aa' 라는 새로운 String 객체가 생성된며 1에서 생성되었던 String 객체는 GC에 의해 소멸된다.

String 비교

위에서는 리터털로 생성된 String과 new연산자로 생성된 String을 비교해보았다. 이번에는 똑같은 리터럴을 가진 String객체를 비교하면 어떤결과가 나올까 테스트 해보았는데 결과는 true가 나왔다. true가 나온 이유는

a1변수와 a2변수가 서로 동일한 곳을 참조하기 때문이다

 

리터럴로 생성된 String 객체는 String Constant Pool에 저장된다고 했다.

 

'a2' 변수에 'a'가 할당될때 먼저 String Constant Pool에 동일한 리터럴이 있는지 확인하는데
동일한 리터럴이 있으면 해당 Constant Pool의 주소를 참조하고 없으면 새로운 Constant Pool이 생성된다

변수 a1와 a2는 서로 동일한 주소를 참조하고 있기때문에 true가 나오게 된것이다.

String intern() ?

String 클래스의 메서드엔 intern() 이라는 메서드가 존재하는데 설명은 아래와 같다.




그렇다. intern() 이란 메서드는 String Constant Pool에 자기자신이 갖고있는 리터럴이 있으면 해당 Constant Pool를 참조하는 리터럴을 반환하고 그렇지 않으면 새로운 String Constant Pool을 생성후 그곳을 참조하는 리터럴을 반환한다. 한번 확인해보자.



String 비교 (2)

Heap 영역에 생성된 String객체에 intern() 메서드를 호출하여 a1 변수와 비교를 해보니 true값이 나왔다.

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함