본문 바로가기
JAVA/Java Study

[Java] StringBuffer 개념과 사용법

by ♡˖GYURI˖♡ 2024. 1. 11.

String 클래스는 immutable(불변) 불변성을 가졌기 때문에 String 객체를 변경 시, 실제로 변경되는 것이 아닌 새로운 String 객체를 생성한다. 즉, 지정된 문자열을 변경할 수 없다.

 

반면 StringBuffer 클래스는 mutable(가변) 가변성을 가져, 동일산 객체 내에서 문자열 변경이 가능하다.

 

 

StringBuffer/StringBuilder 클래스의 차이점

StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있다. 그래서 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어트리게 된다.

 

그래서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 추가되었다.

StringBuilder는 StringBuffer와 완전히 똑같은 기능을 가지고 있으며, 멀티쓰레드 환경이 아니라면 StringBuilder를 사용하는게 효율적이다.

 

 

정리

  • 문자열 변경이 빈번하지 않다면 → String 클래스 사용
  • 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이면 → StringBuffer 클래스 사용
  • 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이 아니라면  → StringBuilder 클래스 사용

 

 

StringBuffer

StringBuffer 선언

1. 기본 생성자 : 기본적으로 16문자를 담을 수 있는 버퍼 생성

StringBuffer sb = new StringBuffer();

 

2. StringBuffer(int length) : 지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스 생성

StringBuffer sb = new StringBuffer(10); // 10개의 문자를 담을 수 있는 버퍼를 생성

 

3. StringBuffer(String str) : 지정된 문자열 값을 갖는 StringBuffer 인스턴스 생성

StringBuffer sb = new StringBuffer("Hello"); // 출력 : sb = Hello

 

 

StringBuffer의 생성자와 메서드

메서드/설명 예제 결과
append()
매개변수로 입력된 값을 문자열로 반환하여 StringBuffer 인스턴스가 저장하고 있는 문자열의 뒤에 추가한다.
StringBuffer sb = new StringBuffer("Hello");
StringBuffer sb2 - sb.append(" world");
(동일한 객체 내에서 문자열 변경)
sb = "Hello world"
sb2 = "Hello world"
capacity()
StringBuffer 인스턴스의 버퍼 크기를 알려준다.

length()
버퍼에 담긴 문자열의 길이를 알려준다.
StringBuffer sb = new StringBuffer(10);
sb.append("ABCD");
int bufferSize = sb.capacity();
int stringSize = sb.length();
bufferSize = 10
stringSize = 4
charAt(int index)
지정된 위치(index)에 있는 문자를 반환한다.
StringBuffer sb = new StringBuffer("Hello");
char c = sb.charAt(1);
c = 'e'
delete(int start, int end)
시작위치부터 끝위치 사이에 있는 문자를 제거한다. 단, 끝 위치의 문자는 제외.
StringBuffer sb = new StringBuffer("Hello");
sb.delete(1, 4);
sb = "Ho"
deleteCharAt(int index)
지정된 위치(index)의 문자를 제거한다.
StringBuffer sb = new StringBuffer("Hello");
sb.deleteCharAt(1);
sb = "Hllo"
insert(int pos, 매개변수)
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos) 앞에 추가한다. pos는 0부터 시작.
StringBuffer sb = new StringBuffer("0123456");
sb.insert(4, "ABC");
sb = "01234ABC56"
replace(int start, int end, String str)
지정된 범위의 문자들을 주어진 문자열로 바꾼다. end 위치는 범위에 포함 X.
StringBuffer sb = new StringBuffer("0123456");
sb.replace(3, 6, "AB");
sb = "012AB6"
reverse()
StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다.
StringBuffer sb = new StringBuffer("0123456");
sb.reverse();
sb = "6543210"
setCharAt(int index, char ch)
지정된 위치의 문자를 주어진 문자(ch)로 바꾼다.
StringBuffer sb = new StringBuffer("0123456");
sb.setCharAt(5, 'A');
sb = "01234A6"
setLength(int newLength)
지정된 길이로 문자열의 길이를 변경한다. 빈 공간은 null('\u0000')로 채운다.
StringBuffer sb = new StringBuffer("0123456");
sb.setLength(5);

StringBuffer sb2 = new StringBuffer("0123456");
sb2.setLegth(10);
String str = sb2.toString().trim();
sb = "01234"
sb2 = "0123456   "
str = "0123456"
toString()
StringBuffer 인스턴스의 문자열을 String으로 변환
StringBuffer sb = new StringBuffer("0123456");
String str = sb.toString();
str = "0123456"
substring(int start)
substring(int start, int end)
지정된 범위 내의 문자열을 String으로 뽑아서 반환한다.
StringBuffer sb = new StringBuffer("0123456");
String str = sb.substring(3);
String str2 = sb.substring(3, 5);
str = "3456"
str2 = "34"

 

StringBuffer의 비교

StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb == sb2);          //  false
System.out.println(sb.equals(sb2));     //  false

 

StringBuffer 클래스는 equals 메소드를 오버라이딩하지 않아서 equals를 사용해도 등가비교연산자(==)로 비교한 것과 가은 결과를 얻는다.

 

반면 toString()은 오버라이딩되어 있어서 StringBuffer 인스턴스에 toString()을 호출하면, 담고 있는 문자열을 String으로 반환합니다.

그래서 StringBuffer 인스턴스에 담긴 문자열을 비교하기 위해서는 toString()을 호출해서 String 인스턴스를 얻은 다음, equals()를 통해 비교해야 합니다.

 

String s = sb.toString();
String s2 = sb2.toString();
 
System.out.println(s.equals(s2)); // true

 

 

 

 

 


 

자바 StringBuffer, StringBuilder 개념부터 사용법까지

자바에서 String 외에도 StringBuffer와 StringBuilder가 있는데 보면 뭔 용도로 쓰는지 감이 안올 것이다 append를 이용해서 값을 붙일 수 있다고는 하는데 그건 String도 .concat(값) 혹은 + "값" 을 사용해 붙

wakestand.tistory.com

 

[Java/자바] StringBuffer 클래스 사용법

String 클래스는 immutable(불변) 불변성을 가졌기 때문에 String 객체를 변경시 실제로 변경되는 것이 아닌 새로운 String 객체를 생성합니다. 즉, 지정된 문자열을 변경할 수 없습니다. 반면 StringBuffer/S

hstory0208.tistory.com