티스토리 뷰
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 |