String클래스는 불변이라는 특성에 의해 지정된 문자열을 변경할 수 없지만 StringBuffer클래스의 인스턴스는 변경이 가능하다. 인스턴스 내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며, StringBuffer 인스턴스를 생성할 버퍼의 크기를 지정해줄 수 있다.
StringBuffer는 인스턴스를 생성할때, 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다. 또한 문자열을 인자로 넣어 생성하면 해당 문자열의 길이 +16의 길이에 해당하는 문자열 버퍼를 생성한다.
문자열의 길이가 버퍼의 크기보다 커질경우 버퍼의 크기는 변경될수 없으므로 새로운 길이의 버퍼를 생성한후 기존의 버퍼에 저장된 데이터를 복사한다.
StringBuffer는 String클래스와 달리 내용을 변경할 수 있다.
ex)
StringBuffer a = new StringBuffer("abc");
a.append("def");
//a.equals("abcdef") == true
위와같이 String 클래스는 새로운 문자열을 만들어 해당 문자열을 가리키는 반면 StringBuffer 기존의 문자열("abc")에 "def"를 더할 수 있다.
StringBuffer클래스의 비교
StringBuffer클래스는 equals메소드가 오버라이딩 되어있지않아 equals메소드와 == 이 같다. 두개모두 값이아닌 주소를 비교한다. StringBuffer인스턴스의 데이터를 비교하기 위해서는 toString을 호출하여 String클래스에 저장하고 저장된 데이터를 equals 메소드를 통해 비교해야한다.
StringBuffer는 equals메소드도 비교가 불가능하기 때문에 꼭 toString()메소드를 통해 String 인스턴스를 만들어 값을 넣어주고 해당 String 인스턴스간에 equals메소드로 비교를 해준다.
StringBuffer클래스의 메소드
StringBuffer(int length) : length에 해당하는 길이의 버퍼를 가진 StringBuffer를 생성한다.
StringBuffer(String str) : 문자열(str)을 갖는 StringBuffer인스턴스를 생성한다. StringBuffer의 길이는 str.length + 16 이다.
StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(char[] str)
StringBuffer append(double d)
StringBuffer append(float f)
StringBuffer append(int i)
StringBuffer append(long l)
StringBuffer append(Object obj)
StringBuffer append(String str)
입력된 매개변수의 값을 문자열로 변환하여 StringBuffer인스턴스의 문자열 뒤에 붙인다.
int capacity() : StringBuffer 인스턴스의 버퍼크기를 알려준다.
int length() : StringBuffer 인스턴스에 저장되어있는 문자열의 길이를 반환해준다.
char charAt(int index) : 지정된 위치(index)에 있는 문자를 반환한다.
StringBuffer delete(int start, int end) : 시작위치(start)부터 끝위치(end)까지의 문자열을 제거한다. 끝위치의 문자는 제외한다.
StringBuffer deleteCharAt(int index) : 지정된 위치(index)의 문자를 제거한다.
StringBuffer insert(int pos, boolean b)
StringBuffer insert(int pos, char c)
StringBuffer insert(int pos, char[] str)
StringBuffer insert(int pos, double d)
StringBuffer insert(int pos, float f)
StringBuffer insert(int pos, int i)
StringBuffer insert(int pos, long l)
StringBuffer insert(int pos, Object obj)
StringBuffer insert(int pos, String str)
두번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다. pos는 0부터 시작
StringBuffer replace(int start, int end, String str) : start~end의 문자열을 주어진 문자열(str)로 바꾼다. end는 포함되지 않는다.
StringBuffer reverse() : StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다.
void setCharAt(int index, char ch) : 지정된 위치의 문자를 주어진 문자(Ch)로 바꾼다.
void setLength(int newLength) : 문자열의 길이를 newLength길이로 변경한다. 길이를 늘리는 경우에 나머지 빈 공간을 '\u0000'로 채운다.
String toString() : StringBuffer 인스턴스의 문자열을 String 클래스로 값으로 반환한다.
String substring(int start), String substring(int start, int end) : 지정된 범위의 문자열을 String으로 뽑아서 반환한다.
시작위치(start)만 지정하면 시작위치부터 문자열 끝까지 뽑아서 반환한다.
StringBuffer메소드 사용
StringBuilder
StringBuffer는 멀티쓰레드에 안전하도록 동기화 되어있다. 동기화가 StringBuffer의 성능을 떨어뜨린다. 멀티쓰레드로 작성된 프로그램이 아닌 경우 StringBuffer의 동기화는 불필요하게 성능을 떨어뜨린다.
쓰레드 동기화에 의한 성능 저하를 해결하기 위해 StringBuffer에서 동기화만 제거한 StringBuilder가 새로 추가되었다.
StringBuffer와 StringBuilder는 똑같은 기능으로 작성되어있어 성능향상을 필수로 하는경우가 아니라면 StringBuffer를 StringBuilder로 굳이 바꿀 필요는 없다.
'Programming > JAVA' 카테고리의 다른 글
ArrayList LinkedList (0) | 2021.07.29 |
---|---|
Collections Framework (0) | 2021.07.26 |
String 클래스 (0) | 2021.07.26 |
Object클래스 메서드 (0) | 2021.07.18 |
예외처리 Exception handling (0) | 2021.07.17 |