[Java] StringBuilder 클래스

Yujeong·2024년 5월 19일
0

Java

목록 보기
5/22
post-thumbnail

String 클래스의 문제

  • 내부 값을 변경할 수 없기 때문에 변경된 값을 기반으로 새로운 객체를 생성한다.
  • 중간에 만들어진 객체는 제대로 사용되지 않고, GC 대상이 된다.
  • CPU, 메모리 등의 자원을 많이 사용하게 된다.

StringBuilder 클래스

StringBuilder는 가변 String으로, 불변 String의 문제를 해결할 수 있다.

구조

StringBuilder 내부를 살펴보면, final이 아닌 변경할 수 있는 byte[]를 가지고 있다.

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuilder>, CharSequence
{ ... }
abstract class AbstractStringBuilder implements Appendable, CharSequence {

    byte[] value;
    ...

}

메서드

  • append(): 문자열 추가
  • insert(): 특정 위치에 문자열 삽입
  • delete(): 특정 범위의 문자열 삭제
  • reverse(): 문자열 뒤집기
StringBuilder sb = new StringBuilder();
sb.append("Hello,");
sb.append("World!");
System.out.println(sb); // Hello, World!

sb.delete(0,12);
System.out.println(sb); // !

sb.append("AB");
System.out.println(sb); // !AB

sb.reverse();
System.out.println(sb); // BA!

// StringBuilder -> String 변환
String str = sb.toString();

특징

  • StringBuilder는 가변적이다.
  • 객체 안에서 문자열을 추가, 삭제, 수정할 수 있기에 새로운 객체를 생성하지 않아도 된다.
  • 메모리 사용을 줄이고 성능을 향상시킬 수 있다.

주의

  • 사이드 이펙트가 발생할 수 있다.
  • 문자열 변경하는 동안에만 StringBuilder를 사용하고, 변경이 끝나면 불변인 String으로 변환하는 것이 좋다.

String 최적화

문자열 리터럴

  • 컴파일 전
String str = "Hello, " + "World!";
  • 컴파일 후
String str = "Hello, World!";

String 변수

// str1, str2가 객체인지 리터럴 문자열인지 알 수 없음
String result1 = str1 + str2;

// StringBuilder를 사용하여 최적화 수행
String result2 = new StringBuilder().append(str1).append(str2).toString();

반복문

String과 StringBuilder 각각을 사용하여 100000회 hello를 더했을 때, 각각 약 2.5초와 약 0.003초가 걸렸다.

  • String
long startTime = System.currentTimeMillis();

String str = "";
for (int i = 0; i < 100000; i++) {
    str += "hello";
    /**
     * str = new StringBuilder().append(str).append("hello").toString();
     * 의 방법으로 최적화 된다.
     */
}

long endTime = System.currentTimeMillis();

System.out.println(endTime - startTime); // 2490ms
  • StringBuilder
long startTime = System.currentTimeMillis();

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
    sb.append("hello");
}
String str = sb.toString();

long endTime = System.currentTimeMillis();

System.out.println(endTime - startTime); // 3ms

StringConcatFactory

java 9부터는 StringConcatFactory를 사용해서 최적화를 수행한다.

public static CallSite makeConcatWithConstants(MethodHandles.Lookup lookup,
                                               String name,
                                               MethodType concatType,
                                               String recipe,
                                               Object... constants)
    throws StringConcatException
{ ... }

메서드 체이닝

메서드 체이닝(Method Chaning)은 자기 자신의 참조값을 반환하면서 이를 새로운 변수에 담지 않고, 바로 메서드를 호출하여 사용하는 방법이다.

  • 개념
public class MethodChaning {

    public static void main(String[] args) {
        ValueAdder adder = new ValueAdder();
        int str = adder.add(10).add(20).add(30).getvalue();
        System.out.println(str); // 60
    }
}
public class ValueAdder {
    private int value;
    
    public ValueAdder add(int addValue) {
        value += addValue;
        return this;
    }
    
    public int getValue() {
        return value;
    }
}
  • StringBuilder
public class MethodChaining2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        String str = sb.append("a").append("b).append("c")
            .insert(3, "java")
            .delete(3,7)
            .reverse()
            .toString();
        System.out.println(str); // cba
    }
}

참고
Class StringBuilder
김영한의 실전 자바 - 중급 1편

profile
공부 기록

0개의 댓글

관련 채용 정보