오늘의하루

[JAVA] StringBuffer클래스의 메서드 본문

JAVA

[JAVA] StringBuffer클래스의 메서드

오늘의하루_master 2022. 8. 8. 10:19

StringBuffer의 특징

StringBuffer는 동기화(데이터 보호)되어 있고 멀티스레드에 안전하다는 특징이 있다.

  • 스레드의 종류 및 특징
    • 싱글 스레드는 한 번에 1개의 작업을 하는 것을 말합니다.
    • 멀티 스레드는 한 번에 n개의 작업을 하는 것을 말합니다.
      • 멀티 스레드의 경우 스레드끼리 데이터를 공유하는데 이때 데이터가 꼬일 수 있으며 이를 방지하기 위해서는 동기화로 작업해주어야 합니다. (데이터 보호 목적)

  • StringBuffer() : 16 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성한다.
  • StringBuffer(int length) : 지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성한다.
  • StringBuffer(String str) : 지정된 문자열 값(str)을 갖는 StringBuffer 인스턴스를 생성한다.
class StringBuffer1{
    StringBuffer sb1 = new StringBuffer(); // 결과 : sb = ""
    StringBuffer sb2 = new StringBuffer(10); // 결과 : sb = ""(배열 길이 10)
    StringBuffer sb3 = new StringBuffer("Hi"); // 결과 : sb = "Hi"
}
  • StringBuffer append(...) : 매개변수로 입력된 값을 문자열로 변환하여 StringBuffer 인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다.
    • ... 에 들어갈 수 있는 타입 : boolean, char, char [], double, float, int, long, Object, String
    • StringBuffer C = A.append(B) : A가 가리키는 객체에 B를 덧붙이고 그 주소를 참조 변수 C에 대입한다.
class StringBuffer2{
    StringBuffer sb1 = new StringBuffer("abc");
    
    void appendTest(){
        StringBuffer sb2 = sb1.append(true);
        sb1.append('d').append(10.0f); // f는 배열에 들어가지 않는다.
        StringBuffer sb3 = sb1.append("ABC").append(123);
        System.out.println(sb1); // abctrued10.0ABC123
        System.out.println(sb2); // abctrued10.0ABC123
        System.out.println(sb3); // abctrued10.0ABC123
    }
}
  • int capacity() : StringBuffer 인스턴스의 버퍼 크기( 총배열의 길이 )를 알려준다.
  • int length() : StringBuffer 인스턴스에 담긴 문자열의 길이를 알려준다.
class StringBuffer3{
    StringBuffer sb = new StringBuffer(100);
    
    void appendTest(){
        sb.append("abcd");
    }
    int bufferSize = sb.capacity(); // bufferSize = 100
    int stringSize = sb.length(); // stringSize = 4
}
  • char charAt(int index) : 지정된 위치(index)에 있는 문자를 반환한다.
class StringBuffer4{
    StringBuffer sb = new StringBuffer("abc");
    char c = sb.charAt(2); // c = 'c'
}
  • StringBuffer delete(int start, int end) : 시작 위치(start)부터 끝 위치(end) 사이에 있는 문자를 제거한다.
    • 단, 끝 위치(end)의 문자는 제외한다.
    • start <= x < end
  • StringBuffer deleteCharAt(int index) : 지정된 위치(index)의 문자를 제거한다.
  • StringBuffer insert(int pos,...) : 두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다.
    • ... 에 들어가는 타입 : boolean, char, char [], double, float, int, long, Object, String
class StringBuffer5{
    StringBuffer sb1 = new StringBuffer("0123456");
    StringBuffer sb3 = new StringBuffer("0123456");
    StringBuffer sb4 = new StringBuffer("0123456");
    
    void get(){
        StringBuffer sb2 = sb1.delete(3,6); // 345
        System.out.println(sb1); // 0126
        System.out.println(sb2); // 0126
        
        sb3.deleteCharAt(3); // index 3 위치 제거
        System.out.println(sb3); // 012456
        
        sb4.insert(4,'.'); // index 4 위치에 .을 추가한다.
        System.out.println(sb4); // 0123.456
    }
}
  • StringBuffer replace(int start, int end, String str) : 지정된 범위(start~end)의 문자들을 주어진 문자열로 바꾼다.
    • 단, end 위치에 있는 문자는 포함되지 않는다.
    • start <= x < end
class StringBuffer6{
    StringBuffer sb = new StringBuffer("0123456");
    
    void replaceTest(){
        sb.replace(3,6,"AB"); // 인덱스 3 ~ 5까지 제거 후 "AB"로 대체
        System.out.println(sb); // 012AB6
    }
}
  • StringBuffer reverse() : StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다.
class StringBuffer7{
    StringBuffer sb = new StringBuffer("asdf0123");
    
    void reverseTest(){
        sb.reverse();
        System.out.println(sb); // 3210fdsa
    }
}
  • void setCharAt(int index, char ch) : 지정된 위치의 문자를 주어진 문자(ch)로 바꾼다.
class StringBuffer8{
    StringBuffer sb = new StringBuffer("0123456");
    
    void setCharAtTest(){
        sb.setCharAt(5, 'o');
        System.out.println(sb); // 01234o6
    }
}
  • String toString() : StringBuffer인스턴스의 문자열을 String으로 반환한다.
class StringBuffer9{
    StringBuffer sb = new StringBuffer("0123456");
    String str = sb.toString(); // 문자열 "0123456"
}
  • void setLength(int newLength) : 지정된 길이로 문자열의 길이를 변경합니다.
    • 단, 길이가 늘리는 경우 나머지 빈 공간을 널문자 '\u0000'로 채운다.
class StringBuffer9{
    StringBuffer sb1 = new StringBuffer("0123456");
    StringBuffer sb2 = new StringBuffer("0123456");
    String str = "";
    
    void setLengthTest(){
        sb1.setLength(5); // 012345
        sb2.setLength(10); // 0123456nullnullnull
        str = sb2.toString().trim(); // 0123456
        // trim()은 앞뒤로 빈공간을 없애는 String 메서드이다.
    }
}
  • String substring(int start) : 지정된 위치(start)부터 문자열 끝까지 반환
  • String substring(int start, int end) : 지정된 위치(start)부터 끝 위치(end) 전까지 문자열로 반환한다.
    • start <= x < end
class StringBuffer11{
    StringBuffer sb = new StringBuffer("0123456");
    String str1 = sb.substring(3); // 3456
    String str2 = sb.substring(3, 5); // 34
}

2. StringBuffer에 대해 자세히 알아보기

  • StringBuffer는 String처럼 문자열 배열(char [])을 내부적으로 가지고 있다.
  • String은 불변이지만 StringBuffer는 내용 변경이 가능하다.
StringBuffer sb = new StringBuffer("abc");
// char[] 타입으로 {'a','b','c'} 생성되고 이 주소를 참조변수 sb에 저장한다.
sb.append("123");
// char[] 타입으로 {'a','b','c','1','2','3'} 이렇게 내용이 변경되고 주소를 참조변수 sb에 저장한다.
  • StringBuffer는 equals()가 오버 라이딩되어 있지 않다. (주소 비교)
    • String은 equals()가 오버 라이딩되어 값을 비교한다.
public class StringBufferTEST {
	public static void main(String[] args) {
		
		StringBuffer sb1 = new StringBuffer("abc");
		StringBuffer sb2 = new StringBuffer("abc");
		System.out.println(sb1 == sb2); // 주소비교 false
		System.out.println(sb1.equals(sb2)); // 주소비교 false
		
		//  StringBuffer -> String으로 변환 후 equals()로 값 비교
		String s1 = sb1.toString();
		String s2 = sb2.toString();
		System.out.println(s1.equals(s2)); // 값비교 true
		
		StringBuffer t1 = new StringBuffer("a");
		StringBuffer t2 = t1.append("B");
		StringBuffer t3 = t2.append(10.0f);
		
		System.out.println(t1); // aB10.0
		System.out.println(t2); // aB10.0
		System.out.println(t3); // aB10.0
	}
}
Comments