///////
Search

StringBuffer, StringBuilder

날짜
2022/09/30
태그
자바

변경 불가능한(immutable) 클래스

한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 오기만 가능하고, 변경할 수 없다.
String a = "a"; String b = "b"; a = a + b;
Plain Text
복사
위와 같은 경우 참조변수 a가 참조하고 있는 인스턴스의 값이 aab로 바뀌는 것이 아니라 새로운 문자열(ab)이 담긴 String인스턴스가 생성되고 참조변수a가 새로 생성된 인스턴스를 참조하게 된다.
이처럼 덧셈연산자(+)를 사용해서 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String인스턴스가 생성되어 메모리공간을 차지하게 된다.
문자열 간의 결합이나 추출 등 문자열을 다루는 작업을 많이 하는 경우에는 String클래스 대신 StringBuffer클래스 를 사용하는 것이 좋다. StringBuffer인스턴스에 저장된 문자열은 변경이 가능하기 때문이다.

StringBuffer클래스

내부적으로 문자열 편집을 위한 buffer를 가지고 있으며, 생성할 때 buffer의 크기를 지정할 수 있다.
문자열이 버퍼의 길이를 넘어서게 되면 버퍼의 길이를 늘려주는 작업이 추가로 필요하게 되는데, 이렇게 되면 효율이 떨어지므로 편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다.
버퍼의 길이를 늘려주는 작업
1.
더 길이가 긴 버퍼를 생성
2.
기존 버퍼의 문자열을 복사, 붙여넣기
3.
새로운 버퍼의 주소값을 기존 참조변수에 대입

StringBuffer의 변경

StringBuffer sb = new StringBuffer("a"); sb.append("b");
Plain Text
복사

StringBuffer의 비교

StringBuffer클래스에는 equals()는 오버라이딩 되어 있지 않이만 toString()은 오버라이딩 되어 있다.
StringBuffer sb1 = new StringBuffer("abc"); StringBuffer sb2 = new StringBuffer("abc"); boolean result = sb1.toString().equals(sb2.toString()); System.out.println("result = " + result); //결과 : result = true
Plain Text
복사

StringBuffer의 생성자와 메서드

String클래스와 유사한 메서드를 많이 가지고 있다.
추가, 변경, 삭제와 같이 저장된 내용을 변경할 수 있는 메서드들이 추가로 제공

생성자

StringBuffer()

16문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스 생성
StringBuffer sb = new StringBuffer(); System.out.println(sb.capacity()); //결과 : 16
Plain Text
복사

StringBuffer(int length)

length 만큼 담을 수 있는 버퍼를 가진 인스턴스 생성
StringBuffer sb = new StringBuffer(20); System.out.println(sb.capacity()); //결과 : 20
Plain Text
복사

StringBuffer(String str)

지정된 문자열 값을 갖는 인스턴스 생성
지정한 문자열의 길이보다 16 더 크게 버퍼를 생성
StringBuffer sb = new StringBuffer("hi"); System.out.println(sb.capacity()); //결과 : 18
Plain Text
복사

메서드

append() - 추가

매개변수로 입력된 값을 문자열로 변환하여 StringBuffer인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다.
StringBuffer sb = new StringBuffer("0123456"); sb.append(true); // sb = "0123456true"
Plain Text
복사

delete(int start, int end) - 삭제

start부터 end 사이에 있는 문자를 제거한다.
단, 끝 위치의 문자는 제외
StringBuffer sb = new StringBuffer("0123456"); sb.delete(3, 6); // sb = "0126"
Plain Text
복사

deleteCharAt(int index) - 삭제

index 위치의 문자를 제거한다.
StringBuffer sb = new StringBuffer("0123456"); sb.deleteCharAt(3); // sb = "012456"
Plain Text
복사

insert(int pos, 문자열) - 삽입

두 번째 매개변수로 받은 값을 문자열로 변환하여 pos 위치에 추가한다.
StringBuffer sb = new StringBuffer("0123456"); sb.insert(3, "hi"); // sb = "012hi3456"
Plain Text
복사

replace(int start, int end, String str) - 변경

StringBuffer sb = new StringBuffer("0123456"); sb.replace(0, 7, "hi"); // sb = "hi"
Plain Text
복사

capacity()

버퍼의 크기를 알려준다.
StringBuffer sb = new StringBuffer("0123456"); System.out.println(sb.capacity()); // 23
Plain Text
복사

length()

버퍼에 담긴 문자열의 길이를 알려준다.
StringBuffer sb = new StringBuffer("0123456"); System.out.println(sb.length()); // 7
Plain Text
복사

StringBuilder클래스

StringBuilder는 동기화만 뺀 StringBuffer와 완전히 똑같은 기능으로 작성되어있다.
멀티 쓰레드 프로그램 StringBuffer
싱글 쓰레드 프로그램 StringBuilder
동기화(멀티 쓰레드에 안전)
StringBuilder
StringBuffer