[JAVA] String과 StringBuffer, StringBuilder

U_U·2024년 4월 1일

JAVA

목록 보기
1/1

자바에서 문자열을 받을 때 많이 사용하는 문자열은 String이다.
하지만

String은 정확히 뭘까?

JAVA에서 String은 문자열을 나타내는 불변(immutable) 클래스

String은 문자열을 나타내는 대표적인 클래스로, 다양한 메소드를 제공하기 있기 때문에 문자열을 다룰 때 자주 사용하는 클래스이다.
String은 어떻게 생성하냐에 따라, 어디에 저장되고 어떻게 메모리 관리되는지가 결정된다.

StringPool

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

이 때 이 str 문자열은 각기 다른 곳에 저장된다.
str1의 str은 Java Heap에 저장되어 있지만, str2가 가르키는 str은 StringPool에 저장되어있다.

StringPool은 Java Heap 메모리의 일부로, 문자열 리터럴을 저장하기 위한 영역이다.

1) Java에서 문자열 리터럴을 사용하여 String 객체를 생성하면
2) JVM은 먼저 String Pool을 확인하여 동일한 문자열 리터럴이 이미 존재하는지 검사
3) 만약 해당 문자열이 이미 Pool에 존재한다면, 새로운 객체를 생성하지 않고 기존의 객체를 재사용

하지만, new 키워드를 사용하여 String 객체를 직접 생성하는 경우, 이 객체는 항상 Heap 영역에 새롭게 할당된다.

불변 immutable

String에 저장한 문자열을 다른 값으로 바꾸고 싶을 때는 어떻게 해야될까?
이론적으로 String은 불변클래스이기 때문에 변경할 수 없다.
즉,

String str = "String";
str += "is String";

위 코드에서는 strString이었다가 String is String으로 변경된 것으로 보일 수 있다.
하지만 이는 변경 된 것이 아니라, 새로운 객체가 생성된 것이다.

그림으로 나타내면 다음과 같다.

그렇다면 String문자열을 담고 있던 객체는 어떻게 되는 걸까?
더이상 어디에서도 참조를 하지 않기 때문에 GC의 대상이 된다.

GC가 여러차례 수행된다면,

첫번째,

GC 대상인 객체는 바로 GC에 의해 회수되지 않는다. 즉 GC가 수행되기 전까지 메모리에 남아있기 때문에 메모리 사용량이 증가할 수 있다.

두번째로

GC가 메모리를 검사하고 회수하는 동안 발생하는 Stop-the-World로 인해 어플리케이션이 중지될 수 있다.

GC에 대해서 자세히 알아보고 싶다면 아래의 글을 읽어보길 추천한다.

[JAVA] Heap 구조, GC 동작 방식 그리고 GC 알고리즘 5가지

그렇다면 문자열을 계속 변경하면서 사용하고 싶다면 어떻게 해야할까?

=>String Buffer와 StringBuilder를 사용하면 된다.

String과 StringBuffer,StringBuilder는 뭐가 다를까?

StringBuffer와 StringBuilder는 charSequence 인터페이스를 구현하는 객체이다.

import java.io.*;

StringBuffer sb = new StringBuffer();
sb.append("StringBuffer");
sb.append("is StringBuffer");

  1. new StringBuffer() 호출 시, StringBuffer 객체가 Heap 영역에 생성 (String Pool X)
  2. sb.append("StringBuffer")sb.append("is StringBuffer")를 통해 문자열을 추가할 때, 이 변경사항은 동일한 StringBuffer 객체에 반영
profile
github : https://github.com/oU-Ua

0개의 댓글