String, StringBuilder, StringBuffer

김회민·2023년 2월 11일
0

Java

목록 보기
6/16

String

String str = "hello"; // String str = new String("hello");
str = str + " world"; // str = "hello world";
  • 새로운 값을 할당할 때마다 새로 클래스에 대한 객체가 생성된다.
  • String에서 저장되는 문자열은 private final char[]의 형태이기 때문에 바꿀 수 없다.

String + String + String + …

// 1. str -> "hello"
String str = "hello";

// 2. str -> "hello world" / none -> "hello" ( GC 제거 대상 )
str = str + " world";
  • 각각의 String 주소값이 Stack에 쌓이고, GC가 호출되기 전까지 Heap에 쌓인다.
    • 메모리 관리에 치명적이다.
  • String을 더할때는 StringBuffer나 StringBuilder를 사용하는 것이 좋다.

StringBuffer

public final class StringBuffer
  extends AbstractStringBuilder
  implements Serializable, Comparable<StringBuffer>, CharSequence { ... }
StringBuffer sb = new StringBuffer("hello");
sb.append(" world");

soutp(sb); // hello world
soutp(sb.toString()); // hello world
  • Memory에 append하는 방식으로, 클래스에 대한 객체를 직접 생성하지 않는다.
  • 동기적으로 처리한다. (Thread-Safe)

StringBuilder

public final class StringBuilder
  extends AbstractStringBuilder
  implements java.io.Serializable, Comparable<StringBuilder>, CharSequence { ... }
StringBuilder sb = new StringBuilder("hello");
sb.append(" world");

soutp(sb); // hello world
soutp(sb.toString()); // hello world
  • Memory에 append하는 방식으로, 클래스에 대한 객체를 직접 생성하지 않는다.
  • 비동기적으로 처리한다.

JDK 1.5 이후

  • 컴파일 단계에서 String 객체를 사용하더라도 StringBuilder로 컴파일 되도록 변경되었다.
  • 단, 반복 루프를 사용해서 문자열을 더할 때에는 객체를 계속 추가한다는 사실에는 변함이 없다.

출저

profile
백엔드 개발자 지망생

0개의 댓글