본문 바로가기
아카이브/자바의 정석

9장 java.lang패키지와 유용한 클래스 20201018

by nineteen 2020. 10. 18.
반응형

StringBuffer클래스

 

String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer클래스는 변경 가능

 

내부적으로 문자열 편집을 위한 버퍼를 가지고 있고 인스턴스 생성할 때 크기 지정가능

버퍼 크기를 지정하지 않으면 16으로 설정

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class StringBufferEx1 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("abc");
        StringBuffer sb2 = new StringBuffer("abc");
        
        System.out.println("sb == sb2 ? " + (sb == sb2)); 
        System.out.println("sb.equals(sb2) ? " + sb.equals(sb2));
        
        // StringBuffer의 내용을 String으로 변환
        String s = sb.toString();    // String s = new String(sb);와 같음
        String s2 = sb2.toString();
        
        System.out.println("s.equals(s2) ? " + s.equals(s2));
    }
 
}
 
cs

출력

sb == sb2 ? false

sb.equals(sb2) ? false

s.equals(s2) ? true

 

 

String클래스 equals()메소드 오버라이딩 O

StringBuffer클래스 equals()메소드 오버라이딩 X

                         toString()메소드 오버라이딩 O --> String으로 변환

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class StringBufferEx2 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("01");
        StringBuffer sb2 = sb.append(23);    // 23을 추가한 문자열을 sb2에 저장 sb, sb2는 같다
        sb.append('4').append(56);            // char형 '4'와 int형 56을 추가 -> 문자열로 변환되어 저장
        
        StringBuffer sb3 = sb.append(78);    // 78을 추가한 문자열을 sb3에 저장 sb, sb2, sb3는 같다
        sb3.append(9.0);                    // 실수형을 추가 --> 문자열로 변환되어 저장
        
        // StringBuffer를 String형으로 변환해 출력
        System.out.println("sb =" + sb);
        System.out.println("sb2=" + sb2);
        System.out.println("sb3=" + sb3);
        
        System.out.println("sb =" + sb.deleteCharAt(10));    // 10번째 자리 요소 삭제
        System.out.println("sb =" + sb.delete(36));        // 3~5번째 자리 요소 삭제
        System.out.println("sb =" + sb.insert(3"abc"));    // 3번 자리에 "abc"추가
        System.out.println("sb =" + sb.replace(6, sb.length(), "END"));    // 6번째 자리부터 끝자리요소를 END로 변경
        
        System.out.println("capacity="+sb.capacity());        // sb의 버퍼크기
        System.out.println("length="+sb.length());            // sb에 저장된 문자열 길이
    }
 
}
 
cs

출력

sb =0123456789.0
sb2=0123456789.0
sb3=0123456789.0
sb =01234567890
sb =01267890
sb =012abc67890
sb =012abcEND
capacity=18
length=9

 

--> capacity가 18인 이유

3행에서 StringBuilder인스턴스를 생성할 때 문자열 "01"을 매개변수로 생성해 16(용량) + 2(문자열길이) = 18

 

 

 

 

StringBuilder클래스

 

StringBuffer클래스와 똑같은 기능

 

StringBuffer - 멀티쓰레드에 안전하도록 동기화되어 있음, 멀티쓰레드로 작성 안 된 프로그램에선 성능이 떨어짐

StringBuilder - StringBuffer에서 쓰레드의 동기화만 뺌