JAVA - StringBulider & StringBuffer 클래스

String 은 변경이 불가능한 문자열의 표현을 위한

Class 이지만, StringBuilder와 String Buffer는 변경이

가능한 문자열의 표현을 위한 Class 들이다.

단 String 인스턴스와 달리 StringBuilder 와 StringBuffer의

인트턴스를 가리켜 문자열이라 하지는 않는다


-StringBuilder

StringBuilder는 문자열의 저장 및 변경을 위한

메모리 공간(버퍼)을 내부에 지니는데,

이 메모리 공간은 크기가 자동으로

조절 된다는 특징이 있다. 그리고 이 클래스에서

가장 중요하게 여겨지는 메소드는 append와 insert인데

아래의 소스로 기능을 소개하겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
class test
{
    public static void main(String[] args)
    {
        StringBuilder strBuff = new StringBuilder("AB");
        strBuff.append(25);
        strBuff.append('Y').append(true);
        System.out.println(strBuff);
        
        strBuff.insert(2,  false);
        strBuff.insert(strBuff.length(),  'Z');
        System.out.println(strBuff);
    }
cs




5line에서 문자열 AB를 인자로 StringBuilder의
인스턴스를 생성하고 있다. StringBuilder클래스도
java.lang패키지로 묶여있기 때문에 원하는 순간에 특별한
추가 선언 없이 인스턴스 생성이 가능하다.

다음 6,7line의 append 메소드인데 전달된 값을
StringBuilder의 인스턴스가 저장하고 있는 문자열 데이터의
끝에 문자의 형태로 추가된다. 즉, 이 문장의 실행을
통해 문자 A와 B만 저장되어 있는 메모리 공간의 끝에 문자 2와 5가
추가로 저장되는 것이다.
다음 문자 Y와 boolean형 데이터 true를 저장하고 있다.
그런데 이 문장에서 중요한 사실은 append 메소드가
두 번 이어서 호출되었고, 8행의 sysout을 보면 알수 있듯이
두번의 append 메소드 호출결과가 참조변수 strBuff에 그대로 반영되었다

다음 10line insert 메소드가 호출되어 있는데
첫 번째 전달인자가 2인데 이는 위치가 2인 지점에
(0이 맨앞이므로 실질적으로는 3인 위치)
두 번째 전달인자를 문자 형태로 저장하겠다는 의미이다

StringBuiler의 length 메소드는 버퍼의 길이가 아닌
저장된 문자의 개수 정보를 반환한다.
이 문장은 문자 Z 를 인자로 append 메소드를 호출하는 것과 같다 

7line을 주목해야 한다.
단순히 append 메소드가 두 번 이어서
호출되었다는 사실이 아니라, 두 번째 append
메소드의 호출 결과가 참조변수 strBuff에 반영되었다는
사실이다. 이렇게 되기 위해서는 strBuff.append('Y')의 실행
결과로 strBuff가 반환되어야 하기 때문이다.
그런데 자바에서는 이는 생각보다 어렵지 않은 일이다.

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
package com.jsp.ex;
 
class test2
{
    private int num;
    public test2() { num = 0;}
    
    public test2 add(int num)
    {
        this.num += num;
        return this;
    }
    public void Result()
    {
        System.out.println("add result : " + num);
        
    }
}
     class test
    {
         
        public static  void main(String[] args)
        {
            test2 adder = new test2();
            adder.add(1).add(3).add(5).Result();
        }
    }
 
 
cs




8line 에서 반환형이 test2이고 11line 에서

this를 반환한다. 이때 this는 인스턴스 자신을

뜻하므로 이 문장은 자기 자신을 참조할 수 있는

참조 값의 반환으로 이어진다.


25line에서 adder.add 메소드의 반환값이

adder이기 때문에 반환되는 참조 값을 통한

메소드의 호출이 가능하다.


StringBuffer 클래스는 Thread-safe하다

StringBuffer 클래스와 StringBuilder 클래스가

제공하는 메소드들은 아래 세 가지가 동일하다

-메소드의 수(생성자 포함)

-메소드의 기능

-메소드의 이름과 매개변수 형


따라서 제일 처음 사용한 소스의

StringBuilder 를 StringBuff로 바꿔도

(클래스의 이름만 바꿔도) 컴파일 및 실행이 된다


그렇다면 이 둘의 차이점은?

StringBuffer는 쓰레드에 안전하지만 StringBuilder는 

쓰레드에 안전하지 못하다.



댓글

Designed by JB FACTORY