Skip to content

StringBuilder #12

@SeoMiYoung

Description

@SeoMiYoung

StringBuilder를 왜 쓸까?

Java 코딩테스트에서 StringBuilder는 굉장히 많이 쓰입니다.
그 이유는 한마디로:
문자열을 여러 번 이어 붙일 때, +보다 훨씬 빠르기 때문입니다.

+를 쓰면 느린 이유

String s = "a";
s += "b";   // 실제로는 "ab"라는 새로운 문자열이 생성됨!
  • + 연산을 많이 하면 매번 새 문자열을 만들기 때문에 느려요.
  • 특히 큰 루프에서 문자열을 누적하면 시간 초과 가능성이 있습니다.

StringBuilder는 가변

StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
System.out.println(sb.toString());  // ab
  • 내부에서 한 개의 문자열 버퍼에 계속 붙이기 때문에 효율적
  • 문자열 누적 시 시간복잡도 O(1) 수준

예시 - 옷 정보 출력

<문제 설명>
다음 옷 정보를 출력하시오.

[clothing1 - 옷 정보]
아이디: 2024
이름: Oversized Hoodie
브랜드: UNIQLUX
카테고리: Outerwear
가격: 49900원

자바 코드 예제

class Clothing {
	int id;
    String name;
    String brand;
    String category;
    int price;
    
    public Clothing(int id, String name, String brand, String category, int price) {
    	this.id = id;
        this.name = name;
        this.brand = brand;
        this.category = category;
        this.price = price;
     }
}

public class ClothingTest {
	public static void main(String[] args) {
    	Clothing clothing1 = new Clothing(2024, "Oversized Hoodie", "UNIQLUX", "Outerwear", 49900);
        
        StringBuilder builder = new StringBuilder("[clothing1 - 옷 정보]\n");
        builder.append(String.format("아이디: %d\n", clothing1.id))
               .append(String.format("이름: %s\n", clothing1.name))
               .append(String.format("브랜드: %s\n", clothing1.brand))
               .append(String.format("카테고리: %s\n", clothing1.category))
               .append(String.format("가격: %d원\n", clothing1.price));
               
          System.out.println(builder);
     }
}

만약에 StringBuilder를 안썼다면?

public class ClothingTest {
    public static void main(String[] args) {
        Clothing clothing1 = new Clothing(2024, "Oversized Hoodie", "UNIQLUX", "Outerwear", 49900);
        
        String result = "[clothing1 - 옷 정보]\n"
                + String.format("아이디: %d\n", clothing1.id)
                + String.format("이름: %s\n", clothing1.name)
                + String.format("브랜드: %s\n", clothing1.brand)
                + String.format("카테고리: %s\n", clothing1.category)
                + String.format("가격: %d원\n", clothing1.price);
        
        System.out.println(result);
    }
}

[Java] StringBuilder.append()엔 뭘 넣을 수 있을까?

StringBuilder는 문자열을 조립하는 만능 작업대입니다.
문자(char) 한 알이든, 문자열(String) 덩어리든 가리지 않고 다 붙여줍니다.

1. 팩트: 다 들어갑니다 (오버로딩)

Java 내부적으로 append() 메서드가 수십 개 준비(Overloading)되어 있어서 가능한 일입니다.

StringBuilder sb = new StringBuilder();

char c = 'A';
String str = "pples";
int num = 10;

sb.append(c);      // 문자(char) 쌓기 가능
sb.append(str);    // 문자열(String) 쌓기 가능
sb.append(num);    // 심지어 숫자(int)도 바로 들어감!

System.out.println(sb.toString()); 
// 결과: "Apples10"

2. 꿀팁: 메서드 체이닝 (줄줄이 소세지)

append()는 작업을 마치고 **자기 자신(StringBuilder 객체)**을 반환합니다.
그래서 아래처럼 한 줄로 계속 이어서 쓸 수 있습니다. 코테에서 아주 유용합니다.

StringBuilder sb = new StringBuilder();

sb.append("Hello").append(' ').append("World").append(2024);

// 결과: "Hello World2024"

3. 내부 원리 (살짝 깊게)

겉으로는 String 덩어리를 받는 것처럼 보이지만,
**내부적으로는 거대한 char[] (문자 배열)**을 가지고 있습니다.

  • "Hello"를 넣으면? 👉 내부 배열에 ['H', 'e', 'l', 'l', 'o']를 복사해서 넣음.
  • 'A'를 넣으면? 👉 그 뒤에 ['A']를 넣음.

즉, **"넣는 건 자유, 저장은 문자 배열 형태"**로 한다고 이해하면 정확합니다.


⚡ 3줄 요약

  1. sb.append('a') (문자) ⭕
  2. sb.append("abc") (문자열) ⭕
  3. 고민하지 말고 붙이고 싶은 건 다 집어넣으면 알아서 문자열로 만들어줌.

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions