Java

[Java]String Buffer

MoZZANG 2022. 3. 9. 15:29

문자열을 나타내는 클래스는 총 3가지가 있다.

 

String, String Buffer 그리고 String Builder다.

 

세 종류 클래스의 차이점은 

 

String은 원본 메모리가 불변(immutable)이다. 즉, String클래스의 메소드를 이요해서 새로운 문자열을 생성하면 원래 문자열은 변하지 않고 새롭게 생성된 문자열을 저장하기 위해서 메모리가 새롭게 생성된다. 이런 메모리 낭비를 막기위해 String Buffer클래스 또는 String Builder클래스가 사용된다. 즉 StringBuffer클래스와 StringBuilder클래스는 원본 값이 변한다.(mutable)

 

가장 많이 사용하는 것은 String클래스이다. 

 

이번 포스팅에서는 StringBuffer 클래스의 주요 메소드에 대해 알아보자.

 

 

▲String과 StringBuffer는 서로 다른 클래스이기 때문에 바로 대입불가능이다. 서로가 서로에게 직접 대입할 수 없다. 

만약 String을 타입을 대입하고 싶으면 toString()메소드를 이용해서 형변환을 통해 대입할 수 있다.

 

위 코드의 결과값은 아래와 같다.

String클래스는 초기화하지않으면 자동초기화로써 null이 반환되지만, StringBuffer클래스는 빈문자열이 자동초기화되어 있는 것을 볼 수 있다. 또한 StringBuffer클래스의 기본 크기는 16byte이다.

 

 

▲ String 클래스는 ""을 이용해서 빈문자열을 직접 초기화 시켜줘야 한다.

 

 

 

 

자 이제부터 본격적으로 StringBuffer클래스의 주요 메소드들을 알아보자

 

1) append

 

▲ append는 문자열을 추가할 수 있는 메소드이다. 

 

▲ 첫번째 JAVA는 StringBuffer클래스이고, 두번째 JAVA는 String클래스이다. 기본버퍼크기가 16byte이다보니 4byte문자열은 쉽게 담을 수 있다.

 

 

 

▲ 숫자와 또 다른 문자열을 더 연결해보았다. 만약 String이었다면 여전히 JAVA문자열이 저장되어 있는 메모리가 존재할 것이고, 0123456789이 저장된 메모리, ABCD가 저장된 메모리가 다 따로 존재하며 출력할 때는 메모리의 값이 순차적으로 출력될 것이다.

 

하지만 StringBuffer타입이기 때문에 초기 빈문자열 메모리에 JAVA가 들어가고 또 똑같은 메모리에 0123456789가 들어가 JAVA뒤에 붙고 ABCD또한 같은 메모리에 저장될 것이다.

 

이렇게 해서 최종 buf에 저장된 문자열은 JAVA0123456789ABCD가 된다. 출력결과는 아래와 같다.

 

▲ 버퍼 크기가 늘어난 것을 볼 수 있다. 기존 16byte였는데 우리가 추가한 문자열의 총 길이가 18이다보니 16byte를 넘게 되는 것이다. 이에 자바는 기존 16에 18byte를 추가로 생성해서 늘려버린 것이다.

 

 

 

 

2) trimToSize

 

▲ trimToSize()메소드는 저장된 문자열만큼 버퍼크기를 줄이는 메소드로써 String클래스에는 없는 메소드이다.

 

▲ 저장된 문자열의 크기에 맞게 버퍼크기가 바뀐 것을 볼 수 있다.

 

 

 

 

 

3) delete (int start, int end)

 

▲ delete, 말 그대로 지우는 기능을 하는 메소드이다. 문자열에서 지우기를 원하는 곳의 시작index와 끝index를 인자로 받는데 여기서 주의해야할 것은 인자로 입력한 끝 index 바로 앞까지 삭제한다는 것이다. 즉, 끝 index에 있는 문자는 삭제 되지 않는다.

 

현재 buf에 저장된 데이터는 JAVA0123456789ABCD 이다.

 

▲ index 4가 가리키는 0부터 index 14가 가리키는 A의 앞 문자열까지를 삭제했다. 데이터의 길이는 줄었지만 버퍼크기는 그대로인 것을 볼 수 있다.

 

 

 

 

 

4) deleteCharAt (int index)

 

▲ index가 가리키는 곳의 하나의 문자만 삭제하는 기능의 메소드이다.

 

 

 

 

 

5) insert (int index, String str)

 

▲ append가 기존에 저장된 문자열의 마지막에 새로운 데이터를 갖다붙이는 기능이었다면 insert는 단어의 뜻 그래도 중간에 삽입도 가능한 기능의 메소드이다.

 

넣고싶은 곳의 index값과 해당 index에 넣을 문자열을 인자로 주면된다. 기존에 있던 문자열의 중간에 새로운 문자열을 insert로 넣게 되면 뒤에 있는 문자열들은 자연스럽게 밀리면서 삽입이 된다.

 

현재 buf에 저장되어 있는 문자열은 JAVABCD이다.

 

▲ 기존에 존재하던 문자열 사이에 "12345"를 넣고 이후, 가장 앞쪽에 다시한번 "가나다라"를 insert해주었다.

 

 

 

이번에는 우리가 위쪽에서 알아봤던 메소드들과 앞선 포스팅에서 알아본 메소드들로 문자열에서 필요없는 부분을 삭제시켜보자.

JAVA이후의 문자열부터 끝까지 삭제하자. 즉 삭제후에는 "가나다라JAVA"

▲ 삭제를 원하기 때문에 delete메소드를 사용했으며 삭제를 원하는 문자열의 시작과 끝 index를 위와 같이 정해주었다.

 

 

 

 

 

6) replace (int start, int end, String str)

 

▲ replace, 뜻 그대로 대체하는 기능의 메소드이다. 대체할 위치의 시작과 끝 인자를 주고 대체할 문자열을 준다.

    여기서도 끝 index의 바로 앞위치까지의 문자열을 대체한다는 것을 주의하자.

 

 

 

 

 

 

7) reverse()

 

▲ 기존 문자열을 거꾸로하는 메소드이다.

 

 

 

 

String -> StringBuffer

▲ String과 StringBuffer는 캐스팅연산자를 사용하여도 형변환이 불가하다. 생성자를 사용하여 변경해야한다.

 형 변환 이후에는 String에는 없는 reverse()메소드를 사용할 수 있게 되는 것이다.

 

'Java' 카테고리의 다른 글

[Java]Math 클래스  (0) 2022.03.10
[Java]Regular Expression(정규표현식)  (0) 2022.03.10
[Java]String 클래스 Basic  (0) 2022.03.09
[Java]Wrapper class - part.3(Character)  (0) 2022.03.08
[Java]Wrapper class - part.2(Integer)  (0) 2022.03.08