본문 바로가기
JAVA

[JAVA] StringBuffer, StringBuilder 클래스

by snow_white 2022. 1. 24.

JAVA에서 문자열을 다룰 때 대표적으로 String, StringBuffer, StringBuilder 클래스를 사용한다.

StringBuffer, StringBuilder는 String 클래스의 단점을 보완한 클래스라 생각해도 좋다.

 

String 클래스는 내부의 문자열을 수정할 수 없다.

String data = "Hello";
data += "world!";

 

문자열 결합 연산자 + 를 사용하게 되면 메모리에 새로운 객체가 생성된다.

문자열이 변경되거나 추가되면 새로운 String 객체가 생성되어 재참조된다.

아래 코드를 보면

String data = value1 + value2 + value3;

 

기존 생성되어 있는 객체 value1, value2, value3 => 3개

연산 후 생성되는 객체 (value1 + value2), (value1 + value2 + value3) => 2개

모든 연산 후 생성되는 객체가 모두 5개로 메모리에 생성된다.

 


 

StringBuffer, StringBuilder 클래스

  • 버퍼(Buffer:데이터를 임시로 저장하는 메모리)에 문자열을 저장한다.
  • 버퍼 내부에서 추가, 수정, 삭제 작업을 할 수 있다.
  • 멀티 스레드환경 : StringBuffer 사용 (동기화되어 있음)
  • 단일 스레드환경 : StringBuilder 사용
  • 멀티 스레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하 → StringBuffer 대신 StringBuilder 사용하면 성능 향상 (동기화 여부 제외하고 두 클래스 동일하다고 봄)
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder();			// 기본적인 저장공간을 가짐
StringBuilder sb = new StringBuilder(16);		// 16글자 저장될 공간을 가짐
StringBuilder sb = new StringBuilder("java");		// "Java"라는 데이터를 가진 객체 생성
// StringBuffer 객체 생성
StringBuffer sb = new StringBuffer();			// 기본적인 저장공간을 가짐
StringBuffer sb = new StringBuffer(16);			// 16글자 저장될 공간을 가짐
StringBuffer sb = new StringBuffer("java");		// "Java"라는 데이터를 가진 객체 생성

 

메소드 설명
StringBuffer append(String str)
StringBuilder append(String str)
지정된 문자열을 이 문자 시퀀스에 추가합니다.
StringBuffer insert(int offset, String str)
StringBuilder insert(int offset, String str)

이 문자 시퀀스에 문자열을 삽입합니다.
StringBuffer delete(int start, int end)
StringBuilder delete(int start, int end)
이 시퀀스의 start 지점에서부터 end 지점 사이의 부분 문자열을 제거합니다.
StringBuffer deleteCharAt(int index)
StringBuilder deleteCharAt(int index)
이 시퀀스의 지정된 위치의 문자(1개)를 제거합니다.
StringBuffer replace(int start, int end, String str)
StringBuilder replace(int start, int end, String str)
이 시퀀스의 start 지점에서부터 end 지점 사이의 부분 문자열을 str로 바꿉니다.
StringBuffer reverse()
StringBuilder reverse()
이 문자 시퀀스가 ​​시퀀스의 역순으로 대체되도록 합니다.

 

public class StringBuilderTest {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder();
		
		sb.append("Java ");
		sb.append("Program Study");
		System.out.println(sb.toString());
        // >> Java Program Study
		
		sb.insert(4, "~!~");
		System.out.println(sb.toString());
        // >> Java~!~ Program Study
		
		sb.delete(4, 6);
		System.out.println(sb.toString());
        // >> Java~ Program Study
		
		sb.deleteCharAt(4);
		System.out.println(sb.toString());
        // >> Java Program Study
		
		sb.replace(5, 12, "Programming");
		System.out.println(sb.toString());
        // >> Java Programming Study
		
		sb.reverse();
		System.out.println(sb.toString());
        // >> ydutS gnimmargorP avaJ
	}
}

StringBuffer

- equals()가 오버라이딩되어 있지 않다.(주소비교)

StringBuffer sb  = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");

System.out.println(sb==sb2);			// false
System.out.println(sb.equals(sb2));		// false

- String으로 변환 후에 equals()로 비교해야 한다.

String s  = sb.toString();				// sb를 String으로 변환
String s2 = new StringBuffer("Java");

System.out.println(s.equals(sb2));			// true

 

댓글