티스토리 뷰

Language/Java

[Java] String

DUCKBAE's 2022. 6. 21. 22:26

String 클래스는 불변(immutable) 클래스이다.

 

String 클래스는 문자열을 저장하기 위해서 문자형 배열 참조변수(char[]) value를 인스턴스 변수로 정의해 놓고 있다.

인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스변수(value)에 문자형 배열(char[])로 저장된다.

String 클래스는 앞에 final이 붙어 있으므로 다른 클래스의 조상이 될 수 없다.

한 번 생성된 String 인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수는 없다.

'+' 연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String 인스턴스가 생성된다는 것이다.

 

덧셈 연산자('+')를 사용해서 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String 인스턴스가 생성되어

메모리 공간을 차지하게 되므로 가능한 문자열 결합 횟수를 줄이는 것이 좋다.

문자열 간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String 클래스 대신 StringBuffer클래스를 사용하는게 좋다.

StringBuffer 인스턴스에 저장된 문자열은 변경이 가능하여 하나의 StringBuffer 인스턴스만으로도 문자열을 다루는 것이 가능하다.

 

문자열 생성 방식

//문자열 리터럴 지정
String str1 = "Hello";
String str2 = "Hello";

//String클래스 생성자 이용
String str3 = new String("Hello");
String str4 = new String("Hello");

String클래스의 생성자 이용한 경우,

new 연산자에 의해서 메모리 할당이 이루어지기 때문에 항상 새로운 String 인스턴스가 생성된다.

그러나 문자열 리터럴은 이미 존재하는 것을 재사용한다. (단, 문자 내용이 같은 경우에만 해당되는 사항)

String Literal

문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다.

이 때 같은 내용의 문자열 리터럴은 한번만 저장된다.

문자열 리터럴도 String 인스턴스이고, 한번 생성하면 내용을 변경할 수 없으니 하나의 인스턴스를 공유하면 되기 때문이다.

 

클래스 파일이 클래스 로더에 의해 메모리에 올라갈 때, 클래스 파일의 리터럴은 JVM 내에 있는 상수 저장소(Constant Pool)에 저장된다.

Java 7 버전부터 문자열이 담긴 상수 풀 위치는 Heap 영역으로 옮겨졌다.

 

참고

Java의 정석

'Language > Java' 카테고리의 다른 글

[Java] Stack & Queue  (0) 2022.06.27
[Java] StringBuffer & StringBuilder  (0) 2022.06.22
[Java] 변수  (0) 2022.06.12
[Java] JVM 메모리 관리  (0) 2022.06.11
[Java] 기본형과 참조형  (0) 2022.06.09
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함