티스토리 뷰

1. StringBuilder & StringBuffer 개요

1-1. String VS. StringBuilder/StringBuffer

💡 문자열 처리할 때 가장 많이 사용되는 클래스는 String, StringBuilder, StringBuffer 가 있다.
String은 불변하기 때문에 값을 변경할 수 없다. 이를 해결하기 위해 StringBuilder, StringBuffer 등장.

StringBuffer와 StringBuilder의 차이점? Thread Safe!!
StringBuffer는 Thread Safe 하지만, StringBuilder는 그렇지 않다.
StringBuffer는 synchronized 키워드가 선언되어 있기 때문에 멀티스레드에서 안전하지만 속도는 StringBuilder에 비해 느리다.
  String StringBuilder StringBuffer
modifiable(변경 가능)
(객체의 상태 변경)
X O O
thread safe O X O
synchronized (동기화) X X O
performance (성능) 빠름 빠름 느림

📌 String과 StringBuilder 차이는 알아두자!!

 

package com.ohgiraffers.section03.stringbuilder;

public class Application1 {
    public static void main(String[] args) {

        /* 설명. String과 StringBuilder의 차이점에 대해 이해하고 사용할 수 있다. */
        StringBuilder sb = new StringBuilder("java");
//        StringBuilder sb = "java";          // 리터럴 형태로 초기화는 안됨

        /* 설명. String과 StringBuilder로 수정 시 객체 주소값 변화 살펴보기 */
        String testStr = "java";
        StringBuilder testSb = new StringBuilder("kotlin");

        for (int i = 0; i < 9; i++) {
            testStr += i;
            testSb.append(i);       // append 메소드로 문자열을 이어붙인다.

            System.out.println("String의 경우: " + System.identityHashCode(testStr));
            System.out.println("StringBuilder의 경우: " + System.identityHashCode(testSb));
        }

        System.out.println("String의 결과: " + testStr);
        System.out.println("StringBuilder의 결과: " + testSb);
    }
}

// 실행 결과
String의 경우: 1943105171
StringBuilder의 경우: 2018699554
String의 경우: 1311053135
StringBuilder의 경우: 2018699554
String의 경우: 118352462
StringBuilder의 경우: 2018699554
String의 경우: 1550089733
StringBuilder의 경우: 2018699554
String의 경우: 865113938
StringBuilder의 경우: 2018699554
String의 경우: 1442407170
StringBuilder의 경우: 2018699554
String의 경우: 1028566121
StringBuilder의 경우: 2018699554
String의 경우: 1118140819
StringBuilder의 경우: 2018699554
String의 경우: 1975012498
StringBuilder의 경우: 2018699554

String의 결과: java012345678
StringBuilder의 결과: kotlin012345678
package com.ohgiraffers.section03.stringbuilder;

public class Application2 {
    public static void main(String[] args) {

        /* 수업목표. StringBuilder의 자주 사용되는 메소드의 용법 및 원리를 이해할 수 있다. */
        StringBuilder sb = new StringBuilder();         // 가변객체! 배열의 크기가 증가!
        System.out.println(sb.capacity());              // 16byte의 용량

        /* 설명. StringBuilder는 가변객체(mutable object)로써 내부적으로 용량이 증가하는 방식을 취한다. */
        for (int i = 0; i < 50; i++) {
            sb.append(i);

            /* 설명. 용량을 초과할 것 같으면 (*2 + 2)만큼씩 증가한다.(주소값 변동 X) */
            System.out.println("sb: " + sb);
            System.out.println("capacity: " + sb.capacity());
            System.out.println("identityHashCode: " + System.identityHashCode(sb));;
        }

//        StringBuilder sb2 = new StringBuilder("javamariaDB");
        StringBuffer sb2 = new StringBuffer("javamariaDB");     // multi thread에서 동기화처리 시 고민해볼 정도
        System.out.println(sb2.capacity());         // 문자열 크기(11byte) + 16byte

        /* 필기.
        *   delete(): 시작 인덱스와 종료 인덱스를 이용해서 문자열에서 원하는 부분의 문자열을 제거한다.
        *   deleteCharAt(): 문자열 인덱스를 이용해서 문자 하나를 제거한다.
        *  */
        System.out.println("delete(): " + sb2.delete(2, 5));
        System.out.println("deleteCharAt(): " + sb2.deleteCharAt(0));

        /* 필기.
        *   insert(): 인자로 전달된 값을 문자열로 변환 후 지정한 인덱스 위치에 추가한다.
        *  */
        System.out.println("insert(): " + sb2.insert(1, "vao"));
        System.out.println("insert(): " + sb2.insert(0, "j"));
        System.out.println("insert(): " + sb2.insert(sb2.length(), "jdbc"));

        /* 필기.
        *   reverse(): 문자열 인덱스 순번을 역순으로 재배열한다.
        * */
        System.out.println("reverse(): " + sb2.reverse());
    }
}

// 실행 결과
16

sb: 0
capacity: 16
identityHashCode: 1984697014
sb: 01
capacity: 16
identityHashCode: 1984697014
sb: 012
capacity: 16
identityHashCode: 1984697014
.
.
.
capacity: 16
identityHashCode: 1984697014
sb: 012345678910111213
capacity: 34
identityHashCode: 1984697014
sb: 01234567891011121314
.
.
.
sb: 0123456789101112131415161718192021
capacity: 34
identityHashCode: 1984697014
sb: 012345678910111213141516171819202122
capacity: 70
identityHashCode: 1984697014
.
.
.
sb: 0123456789101112131415161718192021222324252627282930313233343536373839
capacity: 70
identityHashCode: 1984697014
sb: 012345678910111213141516171819202122232425262728293031323334353637383940
capacity: 142
identityHashCode: 1984697014
.
.
.
sb: 012345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
capacity: 142
identityHashCode: 1984697014

27

delete(): jaariaDB
deleteCharAt(): aariaDB

insert(): avaoariaDB
insert(): javaoariaDB
insert(): javaoariaDBjdbc

reverse(): cbdjBDairaoavaj

'한화시스템 > 백엔드' 카테고리의 다른 글

[BE] JAVA_API_Time 패키지  (0) 2024.07.20
[BE] JAVA_API_Wrapper  (1) 2024.07.19
[BE] JAVA_API_String  (1) 2024.07.19
[BE] JAVA_API_Object  (0) 2024.07.19
[BE] JAVA_인터페이스  (0) 2024.07.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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 26 27 28
29 30
글 보관함