[JAVA] StringBuffer 클래스와 StringBuilder

Coastby·2022년 10월 3일
0

LIKELION Back-End School

목록 보기
27/61
post-custom-banner

StringBuffer 클래스

Sring 클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만, StringBuffer 클래스는 변경이 가능하다. 내부적으로 문자열 편집을 위한 buffer를 가지고 있으며, 인스턴스를 생성할 때 그 크기를 지정할 수 있다.

StringBuffer 클래스의 인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간 (buffer)으로 사용된다. 버퍼의 길이를 지정하지 않으면 버퍼의 크기는 16이 된다. StringBuffer 인스턴스로 문자열을 다루는 작업을 할 때, 버퍼의 크기가 작업하려는 문자열의 길이보다 작을 때는 내부적으로 버퍼의 크기를 증가시킨다. 새로운 길이의 배열을 생성한 후에 이전 배열의 값을 복사해야 한다.

○ StringBuffer의 변경

StringBuffer sb = new StringBuffer("hoon");
sb.append("love");				//hoonlove

StringBuffer sb2 = sb.append("lol");
System.out.println(sb);			//hoonlovelol
System.out.println(sb2);		//hoonlovelnl

append()는 반환타입이 StringBuffer인데 자신의 주소를 반환한다. 그래서 위와 같은 문장이 수행되면, sb에 새로운 문자열이 추가되고 sb 자신의 주소를 반환하여 sb2에는 sb의 주소가 저장된다.

하나의 StringBuffer 인스턴스에 대해 아래와 같이 연속적으로 append()를 호출하는 것도 가능하다.

sb.append("123").append("zz");

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

○ StringBuffer 클래스의 생성자와 메서드

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

StringBuilder sb = new StringBuilder("hoon");
System.out.println(sb);			//hoon

sb.append("hi");
System.out.println(sb);			//hoonhi

sb.delete(3,4);
System.out.println(sb);			//hoohi

sb.replace(1,2,"ii");
System.out.println(sb);			//hiiohi

sb.reverse();
System.out.println(sb);			//ihoiih

String sub = sb.substring(1,4);
System.out.println(sub);		//hoi

연습 예제

public class StringBuilderTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        StringBuilder sb = new StringBuilder(input);

        for (int i = 0; i < sb.length(); i++) {
            System.out.println(sb.substring(i) + sb.substring(0, i));
        }
				sc.close();
    }

}

//result
hoon hi!
hoon hi!
oon hi!h
on hi!ho
n hi!hoo
 hi!hoon
hi!hoon 
i!hoon h
!hoon hi

StringBuilder 클래스

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

그래서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었다. 둘은 완전히 똑같은 기능으로 작성되어 있어서, 소스코드에서 StringBuffer 대신 StringBuilder를 사용하도록 바꾸기만 하면 된다.

StringBuffer도 충분히 성능이 좋기 때문에 성능향상이 반드시 필요한 경우를 제외하고는 기존에 작성한 코드에서 StringBuffer를 StringBuilder로 굳이 바꿀 필요는 없다.

profile
훈이야 화이팅
post-custom-banner

0개의 댓글