String, StringBuffer, StringBuilder 알고 사용하자

2025. 12. 16. 22:46·JAVA

문자열을 더하는 로직

문자열을 더하는 방법으로 무엇이 있을까?

  • String 의 + 연산
  • String.concat
  • StringBuffer or StringBuilder 의 append 메서드

String 으로 문자열 더하기


 

String str = "String";
str += "plus";
  • 문자열을 더하는 연산을 할 때는 String 으로 작성하면 무슨 문제가 발생할까
  • String 으로 문자열 더하기 연산을 하면 더해진 문자열을 저장하는 String 객체를 하나 더 생성한다.
  • 새로운 객체를 생성하여 메모리에 할당하는 연산과 이전과 같은 객체가 많이 쌓여 GC가 수행되는 연산까지 합쳐져 오버헤드를 발생하기 때문에 String 으로 더하기 연산은 오버헤드를 발생한다.

StringBuilder , StringBuffer 로 더하기 연산하기


 

StringBuilder sb = new StringBuilder("String");
sb.append("plus");
  • StringBuilder 나 StringBuffer 는 가변 객체이다.

String + 연산은 실제론 StringBuilder 를 사용한다?

  • 자바의 버전이 올라가면서 이러한 String 의 오버헤드를 줄이고자 컴파일 시점에 StringBuilder 로 최적화가 이루어진다.

 

String s = "Hello, " + "World!"; // 프로그램 코드
 
String s = "Hello, World!"; // 실제 컴파일 후 코드
  • 위처럼 상수 문자열끼리 더할 땐 더해져 있는 문자열로 변경해준다.

 

// 프로그램 코드
String name = "Java";
String s = "Hello, " + name + "!";

// 실제 컴파일 후 코드
String s = new StringBuilder()
               .append("Hello, ")
               .append(name)
               .append("!")
               .toString();
  • String 변수를 + 연산에 사용했다면 StringBuilder 로 변경해준다.

 

// 비효율적인 최적화
for (int i = 0; i < 3; i++) {
    result = new StringBuilder()
                 .append(result)
                 .append(i)
                 .toString();
}

// 좋은 코드 가이드

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) {
    sb.append(i);
}
String result = sb.toString();
  • 하지만 위처럼 for 문 안에 StringBuilder 로 최적화가 이루어진다면 똑같이 StringBuilder 를 계속 생성하므로 오버헤드가 남아있다
  • 따라서 for 문 전에 미리 객체를 생성하는 습관을 가지면 좋다

StringBuilder 가 String 보다 항상 성능이 좋을까?

  • StringBuilder 나 StringBuffer 는 가변 객체이므로 크기를 넘으면 메모리를 더 크게 재할당하고 내용을 복사하는 오버헤드가 존재한다.
  • 따라서 적은 양의 문자열 연산에서는 String 을 쓰나 StringBuilder 를 쓰나 차이가 크진 않다.

문자열 클래스 선택 기준

  • 위에서 다뤘듯이 String 은 컴파일 시점에 StringBuilder 를 변환해주기도 하고 적은 양의 문자열을 연산할 때는 String 을 사용해도 큰 차이가 없다.
  • 하지만 많은 문자열을 연산한다면 StringBuilder 를 사용하는 것을 권장한다.
  • 추가로 thread-safe 해야한다면 StringBuffer 를 사용하자

 

'JAVA' 카테고리의 다른 글

System.currentTimeMills(), System.nanoTime() 알고 사용하자  (0) 2025.12.16
깊은복사와 얕은복사란? Cloneable 을 사용하지 말자  (0) 2025.11.24
자바의 제네릭 기초부터 deep dive  (0) 2025.11.24
java 에서 equals 와 hashcode 를 재정의 해야하는 이유  (0) 2025.11.11
[java의 병렬 프로그래밍] complete 할 수 있는 Future -CompletableFuture 의 원리와 사용법  (0) 2025.07.30
'JAVA' 카테고리의 다른 글
  • System.currentTimeMills(), System.nanoTime() 알고 사용하자
  • 깊은복사와 얕은복사란? Cloneable 을 사용하지 말자
  • 자바의 제네릭 기초부터 deep dive
  • java 에서 equals 와 hashcode 를 재정의 해야하는 이유
천방지축 개발자
천방지축 개발자
기록용 블로그
    250x250
  • 천방지축 개발자
    KKanging
    천방지축 개발자
  • 전체
    오늘
    어제
    • 분류 전체보기 (127)
      • 백엔드 (32)
        • Spring framework (4)
        • SpringSecurity (6)
        • JPA (4)
        • DB (6)
        • Spring Cloud (2)
        • CI CD (0)
        • 아키텍처 & 패러다임 & 디자인 패턴 (6)
        • 시스템 설계 & 성능 개선 (4)
      • JAVA (10)
        • 언어 (3)
        • JVM (4)
      • cs (57)
        • 운영체제 (8)
        • 컴퓨터네트워크 (6)
        • 자료구조 (15)
        • 알고리즘 (8)
        • http (20)
      • 인공지능 (5)
        • Reinforcement Learning (5)
      • 기타 (9)
        • 백준 (2)
        • python (2)
        • 백준 장학금 (5)
      • 회고 (5)
        • 토덕-리팩터링 (2)
      • 아티클 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준 장학금
    posix
    SpringSecurity
    프로세스
    heapq
    알고리즘
    Kruskal
    자료구조
    엔티티 그래프
    MSA
    스케줄링
    spring
    최대 힙
    AVL트리
    jpa n+1 문제
    최소힙
    운영체제
    연결리스트 종류
    멀티프로세서
    백준장학금
    HTTP
    연결리스트
    강화학습
    JPA
    힙트리
    점근적 표기법
    JVM
    python
    이분탐색이란
    완전이진트리
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
천방지축 개발자
String, StringBuffer, StringBuilder 알고 사용하자
상단으로

티스토리툴바