Skip to main content

Java: StringBuffer 클래스


1. 왜 필요한가? (등장 배경 및 필요성)

1.1 StringBuffer

📌 문제 상황

  • 기존 String불변(immutable) → 문자열을 수정할 수 없음
  • "abc" + "def"처럼 문자열을 반복적으로 연결하면 새로운 객체가 계속 생성됨
  • 루프 내 문자열 누적, 로그 생성, 텍스트 조립 시 성능 저하 & 메모리 낭비 발생

✅ 등장 이유

  • 가변(mutable) 문자열 필요
  • 기존 객체 안에서 문자열을 효율적으로 수정/추가/삭제 가능해야 함
  • 그리고 멀티스레드 환경에서도 안전하게 사용 가능하도록 설계 필요

→ 그래서 등장한 것이 StringBuffer (JDK 1.0부터 존재)

(후속으로 성능 개선 목적의 StringBuilder는 JDK 1.5에 등장)


1.2 StringTokenizer

📌 문제 상황

  • 문자열을 구분자(delimiter) 로 나누고 싶을 때마다 indexOf(), substring()을 반복하는 건 번거롭고 비효율적
  • 문자열을 공백, 콤마, 탭 등으로 분리하는 간단한 기능이 자주 필요

✅ 등장 이유

  • split() 등장 이전부터 빠르게 문자열을 분리할 수 있는 도구 필요
  • 성능이 중요했던 옛 시절, 반복문에서 빠르게 동작하는 문자열 분리기

→ 그래서 등장한 것이 StringTokenizer (JDK 1.0)

→ 이후 등장한 split()에 비해 속도는 빠르지만 정규표현식은 불가


1.3 split() (String 클래스의 메서드)

📌 문제 상황

  • StringTokenizer정규표현식을 못 씀
  • 복잡한 구분자(예: 공백 여러 개, 특수문자 등)는 처리 어렵다

✅ 등장 이유

  • 문자열을 자유로운 규칙(정규표현식)으로 분리할 수 있는 유연한 기능 필요

→ 그래서 등장한 것이 split() 메서드 (JDK 1.4부터 안정화)

  • 정규식 기반, 가독성 높고 활용도 넓음

2. StringBuffer – 선언 방법 및 주요 사용법

2.1 선언 방법

StringBuffer sb1 = new StringBuffer();              // 빈 버퍼 (기본 용량 16)
StringBuffer sb2 = new StringBuffer(50);            // 초기 버퍼 크기 지정
StringBuffer sb3 = new StringBuffer("Hello");       // 초기 문자열 지정

2.2 주요 메서드 예제

StringBuffer sb = new StringBuffer("Java");

sb.append(" is awesome");   // "Java is awesome"
sb.insert(4, " 8");         // "Java 8 is awesome"
sb.delete(0, 5);            // "8 is awesome"
sb.reverse();               // "emosewa si 8"

System.out.println(sb.toString());

3. StringTokenizer – 선언 방법 및 사용법

3.1 선언 방법

StringTokenizer st = new StringTokenizer("a,b,c", ",");

3.2 반복 사용법

while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}

출력

a
b
c

3.3 기타 특징

특징

설명

기본 구분자

공백 (

" \t\n\r\f"

)

성능

split()

보다 빠름

정규식 지원 여부

❌ 불가능


4. split() – 선언 방법 및 사용법

4.1 기본 사용법

String str = "one,two,three";
String[] result = str.split(",");

4.2 정규표현식 사용 예

String s = "apple  banana   melon";
String[] arr = s.split("\\s+");  // 공백 하나 이상 기준

출력

apple
banana
melon

4.3 특수 문자 분리 (예: |, . 등)

String s = "a|b|c";
String[] arr = s.split("\\|");  // |는 정규식 특수문자라 \\로 이스케이프 필요

5. 코딩 테스트 실전 예제

5.1 공백 구분 숫자 입력

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int a = Integer.parseInt(input[0]);
int b = Integer.parseInt(input[1]);
System.out.println(a + b);

5.2 빠른 입력 + 반복 분리 (StringTokenizer)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int sum = 0;
while (st.hasMoreTokens()) {
    sum += Integer.parseInt(st.nextToken());
}
System.out.println(sum);

6. 요약 비교

항목

StringBuffer

StringTokenizer

split()

용도

가변 문자열 조작

문자열 구분자 분할

정규식 기반 문자열 분할

동기화

✅ 있음

❌ 필요 없음

❌ 필요 없음

성능

중간

빠름

약간 느림

정규표현식

✅ 지원

등장 시기

오래됨 (JDK 1.0)

오래됨 (JDK 1.0)

나중에 도입됨 (JDK 1.4 이후)

사용 추천 환경

멀티스레드 조작

빠른 단순 입력 분할

복잡한 기준 분할 or 가독성 우선


7. 결론

  • StringBuffer: 멀티스레드 환경에서 가변 문자열 조작이 필요할 때 사용
  • StringTokenizer: 빠르고 간단한 문자열 분할이 필요할 때 유용 (특히 코테)
  • split(): 정규표현식으로 복잡한 기준 분할이 필요할 때 적합
  • 코딩 테스트에서는 상황에 따라 도구를 구분해서 사용하는 것이 중요