[Java] String 생성 방법, String Buffer, String Builder

🏃‍♀️·2023년 8월 22일

Java [이론]

목록 보기
1/14

String 변수를 생성하여 값을 저장하는 방법

  1. 리터럴 문자열을 이용한 선언
String str1 = "String";
  1. new 연산자를 이용한 선언
String str2 = new String("String");  

대게 문자열을 String 변수에 저장한다라는 표현을 많이 하지만 엄밀히 말하자면 틀린 표현이다.

문자열을 String 객체로 힙 영역에 생성되고, 변수는 String 객체를 참조하는 번지 값을 저장하여 스택 영역에 생성된다라는 표현이 더 알맞다.

그러나 일반적으로 전자의 표현을 사용한다고 한다.

비교 연산자 사용해보기

문자열 리터럴로 생성한 방법과 new 연산자를 사용하여 생성한 방법에 따라 비교 연산자의 결과가 달라진다.

String str1 = "String";
String str2 = "String";
String str3 = new String("String");

System.out.println(str1==str2);
System.out.println(str2==str3);
System.out.println(str2.equals(str3));

실행 결과

str1과 str2가 같은 객체의 주소 값을 참조하는가? true
str2와 str3이 같은 객체의 주소 값을 참조하는가? false
str2와 str3의 문자열이 동일한가? true

str1과 str2는 같은 객체를 참조하지만 str3은 다른 객체를 참조한다.


🔎 궁금즘.. 리터럴로 생성되는 변수는 힙 영역을 한 번 싸악 훑는 건가?

String Constant Pool

Java에서 문자열 리터럴을 저장하는 독립된 영역으로 String Pool이라고도 불린다.
Heap 영역에 속해있으며 일반적으로 GC의 대상이 되지 않는다.
String은 불변 객체이기 때문에 문자열 생성 시 String Constant Pool에 저장된 리터럴을 재사용한다.

String str1 = "String";				// String Constant Pool에 저장
String str2 = "String";				// String Constant Pool에 재사용
String str3 = new String("String");	// Heap 영역에 값 저장

이 코드에서 str3이 참조하게 되는 객체는 String Constant Pool 외부의 Heap 영역에 별도로 생성된다.
때문에 성능과 메모리 최적화를 위하여 new 연산자를 통해 String 객체를 생성하는 것을 지양하는 것이 좋다.


String, String Buffer, String Builder

String

String은 불변의 속성을 가지고 있는 객체로 문자열에 연산이 발생했을 때 새로운 객체를 생성한다. 때문에 너무 잦은 값의 변경이 일어나는 경우에 적합하지 못하다.
너무 잦은 변경이 일어나는 값이라면 String Buffer나 String Builder를 사용하는 것이 적합하다.
또한 불변의 속성으로 인해 Thread-Safe가 보장된다.

String Buffer

String Buffer는 동기화를 지원한다. 멀티 스레드 환경에 적합하다.
문자열 연산으로 인해 객체 공간이 부족한 경우 버퍼를 늘려 유연하게 동작한다.

String Builder

String Builder는 동기화를 지원하지 않는다. 단일 스레드 환경에 적합하다.
동기화를 고려하지 않기 때문에 String Buffer보다 연산 속도가 우수하다.
문자열 연산으로 인해 객체 공간이 부족한 경우 버퍼를 늘려 유연하게 동작한다.

0개의 댓글