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 기타 특징
특징 | 설명 |
---|---|
기본 구분자 | 공백 (
) |
성능 |
보다 빠름 |
정규식 지원 여부 | ❌ 불가능 |
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()
: 정규표현식으로 복잡한 기준 분할이 필요할 때 적합- 코딩 테스트에서는 상황에 따라 도구를 구분해서 사용하는 것이 중요