StringBuilder는 자바에서 사용 가능한 문자열과 관련된 주요 클래스 중 하나이다. 이 클래스는 효율적인 문자열 조작 기능이 필요할 때 사용하게 된다. 그렇다면 왜 자바에서는 특별히 효율적인 문자열 조작을 위해 StringBuilder를 사용할까?
StringBuilder의 필요성을 파악하기 위해서는 우선 자바에서 문자열을 처리하는 방식을 알아야 한다. 아래 코드를 예로 보자.
String str = "abc";
str += "de";
위와 같이 str에 "abc"를 저장했다가 "de"를 덧붙이면 우리의 일반적인 생각 혹은 C를 공부해 보신 분이라면 C에서는 아래 표와 같이 "abc"가 있던 메모리 공간 뒤에 "de"를 저장하여, 하나의 문자열로 처리하는 것을 떠올릴 것이다.
변경 전 str | 'a' | 'b' | 'c' | ||
변경 후 str | 'a' | 'b' | 'c' | 'd' | 'e' |
하지만 자바에서 문자열은 이런 방식으로 동작하지 않는다. str은 "abc"라는 객체를 가리키고 있다가 "de"를 더하는 연산이 발생하면 "abcde"라는 새로운 객체를 생성하여 str이 가리키게 된다. 만약 "abc"에서 "c"를 빼는 연산을 해도 방식은 같다. "ab"라는 새로운 객체를 생성한다. 이렇게 수차례 문자열에 대한 연산을 수행한다면 그 횟수만큼 새로운 객체도 생겨날 것이다. 이는 상당히 비효율적이다.
하지만 StringBuilder는 내부 버퍼에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 하도록 설계되어 있다. 따라서 새로운 객체를 만들지 않고 문자열을 조작한다. 이러한 이유 때문에 StringBuilder가 필요한 것이다.
StringBuilder가 제공하는 문자열 조작 메소드는 아래와 같다.
리턴 타입 | 메소드 (매개변수) | 설명 |
StringBuilder | append(String s) | 문자열을 끝에 덧붙이기 |
StringBuilder | insert(int index, String s) | 문자열을 지정 위치에 추가 |
StringBuilder | delete(int startIdx, int endIdx) | 문자열 일부 삭제 |
StringBuilder | replace(int startIdx, int endIdx, String s) | 문자열 일부 대체 |
String | toString() | 완성된 문자열 리턴 |
StringBuilder를 사용하는 예시는 다음과 같다. 아래 코드를 실행하면 data는 "AbcCEF"가 된다.
String data = new StringBuilder()
.append("DEF")
.insert(0, "ABC")
.delete(3, 4)
.replace(1, 2, "bc")
.toString();
아래 책을 공부하는 중 정리한 내용이다.
신용권, 임경균, 『이것이 자바다』, 한빛미디어(2023), p120-121
'개발 언어 및 알고리즘 기초 > JAVA 기초' 카테고리의 다른 글
[Java] 스트림(Stream) 요소 처리 (0) | 2024.04.25 |
---|---|
[Java] Wrapper Class (래퍼 클래스, 포장 클래스) (0) | 2024.04.18 |
[JAVA] Collection Framework 정리 (0) | 2024.04.12 |
[JAVA] Thread 상태 (0) | 2024.04.10 |
[JAVA / 비트 논리 연산자] 비트 논리 연산자의 필요성 증명 과정 이해하기 (0) | 2024.03.04 |