StringBuffer 클래스

박영준·2023년 6월 19일
0

Java

목록 보기
88/111

1. 정의

  • String 의 불변성의 문제를 해결할 수 있는 클래스

  • Buffer

    • StringBuffer 클래스 내부의 문자열 편집을 위한 독립적인 공간
    • 이 곳에 문자열을 바로 추가할 수 있어, 공간의 낭비 X 문자열 연산 속도 ↑
    • StringBuffer 인스턴스를 생성할 때, Buffer의 크기를 지정할 수 있음
      • 단, 편집할 문자열의 길이를 고려해서, 충분한 버퍼의 길이를 잡아야 함
        • 편집 中 문자열 길이 < 버퍼의 길이 일 경우, 추가적으로 버퍼의 길이를 늘리는 작업을 해야하므로 비효율적

2. 사용법

1)

public class Main {
    public static void main(String[] args) {
        // 실험 1
        StringBuffer sb = new StringBuffer();
        sb.append("hello");
        sb.append(" ");
        sb.append("world");

        String str = sb.toString();
        System.out.println(str);        // 실행결과 : hello world

        // 실험 2 : 메소드 체이닝
        StringBuffer sb2 = new StringBuffer();
        StringBuffer sb3 = sb2.append("hello");		// sb2에 "hello"를 추가한 값을 sb3으로.

        if (sb2 == sb3) {
            System.out.println("sb2 == sb3");       // 실행 결과 : sb2 == sb3
        }

        // 실험 3
        String str2 = new StringBuffer().append("hello").append(" ").append("world").toString();
        System.out.println(str2);       // 실행 결과 : hello world
    }
  • 실험 2
    • 메소드 체이닝 : 자기자신을 계속 리턴해서, 자신의 메소드를 호출하는 방식
  • 실험 3
    • append()로 계속 붙여가며 사용 가능

2) StringBuffer 의 메서드

public class StringBuffer_Ex {
    public static void main(String[] args)  {
        String s = "abcdefg";
        StringBuffer sb = new StringBuffer(s);		// String -> StringBuffer
		
        System.out.println("처음 상태 : " + sb);		// 처음상태 : abcdefg
        
        System.out.println("문자열 String 변환 : " + sb.toString());		// String 변환하기
        
        System.out.println("문자열 추출 : " + sb.substring(2,4));		// 문자열 추출하기
        
        System.out.println("문자열 추가 : " + sb.insert(2,"추가"));		// 문자열 추가하기
        
        System.out.println("문자열 삭제 : " + sb.delete(2,4));		// 문자열 삭제하기
        
        System.out.println("문자열 연결 : " + sb.append("hijk"));		// 문자열 붙이기
        
        System.out.println("문자열의 길이 : " + sb.length());		// 문자열의 길이구하기
        
        System.out.println("용량의 크기 : " + sb.capacity());		// 용량의 크기 구하기
        
        System.out.println("문자열 역순 변경 : " + sb.reverse());		// 문자열 뒤집기
        
        System.out.println("마지막 상태 : " + sb);		// 마지막상태 : kjihgfedcba
    }
}

3) Buffer 의 크기

예시 1

public StringBuffer(int length) {
	value = new char[length];		// 버퍼의 크기를 지정할 경우
}

public StringBuffer() {
	this(16)						// 버퍼의 크기를 지정하지 않았을 경우
}

public StringBuffer(String str) {
	this(str.length() + 16);		// 지정된 문자열 길이보다 버퍼의 크기 더 크게 지정할 경우
    append(str);
}
  • StringBuffer 인스턴스를 생성할 때, 버퍼의 크기를 지정하지 않을 경우
    16개의 문자를 저장할 수 있는 크기를 가진 버퍼가 자동 생성된다.

예시 2 : 배열의 복사

char newValue[] = new char[newCapacity];			// 새로운 배열 newValue 을 생성

System.arraycopy(value, 0, newValue, 0, count);		// 기존 배열 value의 내용을 새로운 배열 newValue로 복사 (count : 문자열의 길이)
value = newValue;			// 새로운 배열 newValue의 주소를 참조변수 value에 저장
  • 버퍼의 크기 < 문자열의 길이 일 경우,
    내부적으로 버퍼의 크기를 증가시켜줘야 한다.

4) 내용 변경이 가능

1번

stringbuffer sb = new stringbuffer("abc");

2번

stringbuffer sb = new stringbuffer("abc");
sb.append("123");

3번

stringbuffer sb2 = sb.append("ZZ");		// sb 내용 뒤에 + "ZZ"를 추가
System.out.println(sb);
System.out.println(sb2);

/* 출력 결과
abc123ZZ
abc123ZZ
*/

1, 2, 3번을 모두 합친다면

stringbuffer sb = new stringbuffer("abc");
sb.append("123").append("ZZ");					// sb.append("123") 은 sb라고 볼 수 있다
  • sb 와 sb2 는 모두 같은 stringbuffer 인스턴스를 가리키고 있음
    • 따라서 연속적으로 append() 호출이 가능

5) 비교

class Ex {
	public static void main(String args[]) {
    	StringBuffer sb = new StringBuffer("abc");		// StringBuffer 인스턴스 생성
        StringBuffer sb2 = new StringBuffer("abc");
    
    	String s = sb.toString();			// 1. StringBuffer 인스턴스 호출 후, stringbuffer -> string 으로 형변환
		String s2 = sb2.toString();

		System.out.println(s.equals(sb2));		// 2. equals() 메서드로 두 문자열을 비교
    }
}

3. string, stringbuffer, stringbuilder

참고: string, stringbuffer, stringbuilder

profile
개발자로 거듭나기!

0개의 댓글