StringBuilder란 무엇인가?
예제를 살펴보기 전에 먼저 StringBuilder의 개념부터 짚고 넘어가겠습니다. StringBuilder 클래스는 변경 가능한(mutable) 문자열을 생성하는 데 사용되는 클래스입니다. String과 달리 내부적으로 버퍼를 사용해 문자열을 효율적으로 수정할 수 있으며, 반복적인 문자열 연결 시 성능 면에서 큰 이점을 제공합니다. 다만 StringBuilder는 스레드 안전(thread-safe)하지 않기 때문에, 여러 스레드가 동시에 접근할 수 있다는 점을 유의해야 합니다(스레드 안전성이 필요하다면 StringBuffer를 사용하세요).
이번 글에서는 안드로이드에서 StringBuilder 클래스를 사용하는 방법을 단계별 예제와 함께 살펴보겠습니다.
1단계 — 새 프로젝트 생성
Android Studio에서 새 프로젝트를 생성합니다. 상단 메뉴에서 File ⇒ New Project로 이동한 뒤, 새 프로젝트 생성에 필요한 모든 세부 정보를 입력합니다.
2단계 — 레이아웃 파일 작성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal" android:layout_marginTop="100dp" tools:context=".MainActivity"> <EditText android:id="@+id/edit_query" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter string" /> <Button android:id="@+id/click" android:layout_marginTop="50dp" style="@style/Base.TextAppearance.AppCompat.Widget.Button.Borderless.Colored" android:layout_width="wrap_content" android:background="#c1c1c1" android:textColor="#FFF" android:layout_height="wrap_content" android:text="Button" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text3" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text4" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
위 코드에는 EditText 하나, Button 하나, 그리고 결과를 표시할 TextView 다섯 개가 배치되어 있습니다. 사용자가 버튼을 클릭하면 EditText에 입력된 데이터를 가져와 StringBuilder의 다양한 메서드로 조작한 후, 그 결과를 각 TextView에 표시하는 구조입니다.
3단계 — MainActivity 작성
src/MainActivity.java 파일에 아래 코드를 추가합니다.
package com.example.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
EditText edit_query;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit_query = findViewById(R.id.edit_query);
final TextView textView = findViewById(R.id.text);
final TextView textView1 = findViewById(R.id.text1);
final TextView textView2 = findViewById(R.id.text2);
final TextView textView3 = findViewById(R.id.text3);
final TextView textView4 = findViewById(R.id.text4);
findViewById(R.id.click).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!edit_query.getText().toString().isEmpty()) {
StringBuilder stringBuilder = new StringBuilder(edit_query.getText().toString());
textView.setText(" default String : " + stringBuilder);
textView1.setText(stringBuilder.insert(0, "insert at 0 " + "tutorialspoint.com"));
textView2.setText("Capacity is " + stringBuilder.capacity());
textView3.setText("Delete : " + stringBuilder.delete(1, 3));
textView4.setText("append : " + stringBuilder.append(" appended to string builder"));
}
}
});
}
}위 코드에서는 EditText에 입력된 값으로 StringBuilder 객체를 생성한 뒤, 주요 메서드들을 차례로 호출합니다. 각 메서드의 역할은 다음과 같습니다.
- insert() : 지정한 위치(인덱스)에 새 문자열을 삽입합니다.
- capacity() : 현재 StringBuilder가 확보한 내부 버퍼의 크기를 반환합니다.
- delete() : 시작 인덱스부터 끝 인덱스 직전까지의 문자를 삭제합니다.
- append() : 기존 문자열 끝에 새 문자열을 덧붙입니다.
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 앱을 실행하려면 프로젝트의 액티비티 파일 중 하나를 연 후, 툴바에서 실행(Run) 아이콘을 클릭합니다. 목록에서 자신의 모바일 기기를 선택하면, 기기 화면에 아래와 같은 기본 화면이 표시됩니다.

위 실행 결과에서 EditText에 입력한 원본 문자열과 함께, insert·delete·append 등 다양한 StringBuilder 메서드가 적용된 조작 결과를 한눈에 확인할 수 있습니다. 이처럼 StringBuilder를 활용하면 문자열을 자유롭게 수정하면서도 불필요한 객체 생성 없이 효율적으로 처리할 수 있습니다.