본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/9. 기본 API 클래스

9. Java 자바 [API] - StringBuffer, StringBuilder 클래스

 

 

문자열을 저장하는 String 객체는 내부의 문자열을 수정할 수 없다.

(새로운 문자열을 리턴한다.)

 

String 객체 + 연산을 할 경우도 마찬가지이다.

 

String data = “ABC”;

data += “DEF”

 

String 객체가 새로 생성된다.

 

String 객체는 내부 데이터를 수정할 수 없으므로

“ABC” 에 “DEF”가 추가된 “ABCDEF” 라는 새로운 String 객체가 생성된다.

 

data 변수는 새로 생성된 String 객체를 참조하게 된다.

 

+ 연산자를 사용한 만큼 String 객체 수가 늘어나기 때문에 성능을 느리게 할 수 있다.

따라서 문자열 변경 작업이 많을 경우,

java.lang 패키지의 StringBuffer 또는 StringBuilder 클래스를 사용하는 것이 좋다.

 

이 두 클래스는 내부 버퍼(buffer : 데이터를 임시로 저장하는 메모리)에 문자열을 저장해 두고,

그 안에서 추가, 수정, 삭제 작업을 할 수 있도록 설계되어 있다.

즉, String 처럼 새로운 객체를 만들지 않고 문자열을 조작할 수 있다.

 

StringBuffer와 StringBuilder 의 사용 방법은 동일하다.

 

- 차이점

 

  StringBuffer : 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하다.

 

  StringBuilder : 단일 스레드 환경에서만 사용할 수 있도록 설계되어 있다.

 

 

StringBuilder 클래스는 몇 가지 생성자를 제공한다.

 

- 기본 생성자 StringBuilder() : 16개의 문자들을 저장할 수 있는 초기 버퍼를 만든다.

 

- StringBuilder(int capacity) 생성자

capacity 로 주어진 개수만큼 문자들을 저장할 수 있는 초기 버퍼를 만든다.

 

StringBuilder(String str) 생성자

str 로 주어진 매개값을 버퍼의 초기값으로 저장한다.

 

StringBuilder 는 버퍼의 크기가 부족할 경우 자동으로 버퍼 크기를 늘리기 때문에,

초기 버퍼 크기는 중요하지 않다.

 

StringBuilder sb = new StringBuilder();

StringBuilder sb = new StringBuilder(16);

StringBuilder sb = new StringBuilder(“Java”);

 

StringBuilder 객체가 생성되었다면 버퍼 내에서 문자 추가, 삽입, 삭제 등의 작업을 아래 메소드로 수행할 수 있다.

 

메소드

설명

append(...)

문자열 끝에 주어진 매개값을 추가

insert(int offset, ...)

문자열 중간에 주어진 매개값을 추가

delete(int start, int end)

문자열의 일부분을 삭제

deleteCharAt(int index)

문자열에서 주어진 index의 문자 삭제

replace(int start, int end, String str)

문자열의 일부분을 다른 문자열로 대치

StringBuilder reverse()

문자열의 순서를 뒤바꿈

setCharAt(int index, char ch)

문자열에서 주어진 index의 문자를 다른 문자로 대치

 

append(), insert() 메소드는 매개 변수가 다양한 타입으로 오버로딩되어 있기 때문에

대부분의 값을 문자로 추가 또는 삽입할 수 있다.

 

예) StringBuilderExample.java : 문자열 조작

 

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();  // StringBuilder 객체 생성

        sb.append(“Java ”);   // 문자열을 끝에 추가
        sb.append(“Program Study”);
        System.out.println(sb.toString());

        sb.insert(4, “2”);     // 4번째 문자 뒤에 2 삽입
        System.out.println(sb.toString());

        sb.setChar(4, ‘6’);     // 4번째 문자 뒤의 문자를 6으로 변경
        System.out.println(sb.toString());

        sb.replace(6, 13, “Book”);    // 6번째 문자 뒤부터 13번째 문자까지 “Book” 으로 대치
        System.out.println(sb.toString());

        sb.delete(4, 5);        // 5번째 문자 삭제
        System.out.println(sb.toString());

        int length = sb.length();    // 총 문자 수 얻기
        System.out.println(“총 문자수 : ” + length);

        String result = sb.toString();   // 버퍼에 있는 것을 String 타입으로 리턴
        System.out.println(result);
    }
}

 

* StringBuffer 는 스레드 파트에서!!