티스토리 뷰

Java/Class

[java.lang] StringBuffer

MinChyang 2018. 1. 4. 10:17

StringBuffer Class



◎ Define

- StringBuffer Class는 String Class와 상반 되는 개념을 가지고 있다. String Class가 불변 객체이지만, StringBuffer Class는 

  가변 객체이다. 보통 자바 프로그램 내에서 문자열을 다룰(추가, 변경) 때 사용하며, 객체의 크기가 동적이다. 객체 생성 시 크기를

  지정하지 않아도 기본적으로 16개의 문자를 저장할 수 있는 공간을 가진다.


- String은 가볍다, 하지만 불변 객체이다. StringBuffer는 String에 비해 무겁다, 하지만 가변 객체이다. (Explanation  참조)



◎ StringBuffer Class Constructor


Constructor

Brief description

StringBuffer()

초기 문자열이 없고 16개의 문자를 저장할 수 있는 Buffer를 가진 객체 생성

StringBuffer(String str)

str의 문자열을 가지고 16개의 문자를 저장할 수 있는 Buffer를 가진 객체 생성

StringBuffer(int length)

초기 문자열이 없고 length개의 문자를 저장할 수 있는 Buffer를 가진 객체 생성



◎ StringBuffer Class Method


 Method

Brief description

void append(data)

전달된 데이터를 현재 문자열 끝에 추가한다.

int capacity()

현재 문자열의 총 용량 반환

char charAt(int index)

전달된 데이터 위치의 문자를 반환

delete(int start, int end)

전달된 start부터 end전 까지의 문자를 제거

delete(int index)

전달된 데이터 위치의 문자를 제거

int indexOf(String str)

해당 문자열에서 전달된 문자열과 일치하는 곳의 위치를 반환

int indexOf

(String str, int fromIndex)

해당 문자열에서 전달된 fromIndex부터 전달된 문자열과 일치하는 곳의 위치를 반환

void insert(int offset, data)

전달된 offset 위치에 전달된 data를 삽입

 int lastIndexOf(String str)

전달된 str의 마지막 index 위치를 반환

 int lastIndexOf

(String str, int fromIndex)

해당 문자열에서 전달된 fromIndex부터 전달된 str의 마지막 index 위치를 반환

 int length()

해당 문자열의 문자 개수를 반환

 StringBuffer replace

(int start, int end, String str)

전달된 start에서 end까지의 문자열을 전달된 str 문자열로 대체하여 반환

 StringBuffer reverse()

해당 문자열을 역순으로 된 문자열로 반환

 void setCharAt(int index, char ch)

해당 문자열에서 전달된 index 위치의 문자를 전달된 ch로 변환

void setLength(int newLength)

 해당 문자열의 Buffer 크기를 설정

String substring(int start)

해당 문자열에서 전달받은 start 위치부터 마지막까지의 문자열을 반환

 String substring(int start, int end)

해당 문자열에서 전달받은 start 위치부터 end 위치까지의 문자열을 반환

 String toString()

StringBuffer형인 문자열을 String형으로 변



◎ Explanation


① StringBuffer Class와 String Class의 차이점에 대해서 알아보자.


참조)


1. 만약 문자열 추가나 변경 등의 작업이 많을 경우에는 StringBuffer를 사용하는 게 유리하고, 반대로 작업이 거의 없는 경우에 String을 사용하는 게 유리하다.


2. StringBuffer Class는 가변 객체이고, String Class는 불변 객체이다.


보통 초보 프로그래머의 입장에서는 해당 두 Class의 차이점에 대해 숙지를 하지 못 하고 있는 것이 대부분이다.


정확히 어떤 차이가 있는지 알아보자.


1. String을 불변 객체라고 말 하지만, 그렇다고 해서 String을 사용 했을 때 원하는 결과를 얻지 못 하는 것은 아니다.


밑에 예제를 보면서 이해 해보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class StringBufferClass {
    public static void main(String[] args) {
        
        String str = "";
        str += "this";
        str += " ";
        str += "is String";
        System.out.println(str);
        // result : this is String
 
        StringBuffer sb = new StringBuffer();
        sb.append("this");
        sb.append(" ");
        sb.append("is String");
        System.out.println(sb.toString());
        // result : this is String
 
    }
}




StringBuffer, String 모두 출력 값이 같은 걸 볼 수 있다. 즉, 위에서 말 했던 것처럼 결과를 얻지 못 하는 건 아니다.


그럼 무엇이 문제가 되는 걸까?


객체가 생성 되고 메모리가 사용 되는 과정이 다르다.


(Line 4~7) String 자료형에 + 연산이 있을 때마다 있던 객체는 GC(Garbage Collection) 되고 새로운 String 객체가 생성된다. (변경이 불가능한 불변 객체이기 때문이다.)


(Line 11) StringBuffer 객체를 생성 한 후


(Line 12~14) append() method를 이용해 문자열을 추가/변경 한다. 객체는 (Line 11)에서 단 한 번만 생성이 된다. (변경이 가능한 가변 객체이기 때문이다.)


크게 와닿지 않을 수도 있겠지만, 만약 프로그램상 수도 없이 많은 문자열 값이 추가/변경 된다고 가정 해보자.


이런 경우에 String을 사용한다면 그 수도 없는 추가/변경 작업을 할 때마다 있던 객체는 계속해서 GC 되고 새로운 객체를 생성 할 것이다.


GC가 많이 이루어진다는 것 자체가 그만큼 프로그램이 무거워지고 느려지게 하는 요인이 된다.


따라서 개발자가 프로그래밍을 할 때 어떤 도구를 사용해야 할지 충분히 심사숙고 후 결정 하는 게


한층 더 Restful한 개발자가 되는 길이라고 할 수 있겠다.



※ StringBuffer에 대해서 알아 보았다면, 다음 페이지에 있는 형제 격인 StringBuilder에 
대해서도 한 번 쯤 관찰 해보자. (굉장히 중요한 내용이 가미되어있다.)


'Java > Class' 카테고리의 다른 글

[java.lang] Wrapper  (0) 2018.01.05
[java.lang] Math  (0) 2018.01.05
[java.lang] StringBuilder  (0) 2018.01.04
[java.lang] String  (0) 2018.01.03
[java.lang] Obejct  (0) 2018.01.03
댓글
Notice
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함