티스토리 뷰

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/04   »
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
글 보관함