[Java] StringBuilder 가 필요한 이유, String의 불변객체
String 이라는 객체는 불변 속성을 가지고 있다.
String str1 = "ABC";
String str2 = "DEF";
String str = str1 + str2;
"hi hello" 라는 str1 과 str2를 합친 새로운 문자열을 str이라고 정의하여 생성했다.
이 경우, str를 출력하게 되면 ABCDEF 가 출력된다.
String 문자열은 그 값이 한 번 정의되면 변할 수 없다.
만약 String st = "ABC" 라는 문자열을 정의한 뒤, st += "D" 라는 명령어를 추가했다.
이 경우, String 객체인 st는 ABC에 D를 추가하는 것이 아니다.
기존 String st = "ABC" 가 차지하는 메모리 공간을 garvage collection 으로 보낸 뒤,
새로운 메모리 공간에 String st = "ABCD" 라는 새로운 객체를 생성하는 것이다.
따라서 계속해서 String 을 정의한다는 것은 메모리 공간의 낭비를 의미한다.
이러한 비효율을 극복하기 위해 등장한 개념이 StringBuilder 이다.
StringBuilder
package StringBuilder;
public class main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
// 문자열이 커질수록 자동으로 크기를 추가하기 때문에
// 초기에 주는 생성자에 크기값을 줄 필요가 크게 없다.
sb.append("ABC");
sb.append("DEF");
sb.append("GHI");
System.out.println(sb); // ABCDEFGHI
}
}
Stringbuilder 라는 새로운 객체를 만들어준다. 그 후 이 객체 안에 계속해서 append, 데이터 값을 추가해준 뒤 사용자가 원하는 모든 데이터 값이 추가되었음을 되었음을 완료되었을 때 비로소 Stringbuilder / sb 를 출력한다.
이를 통해서 String 객체의 반복되는 생성을 막을 수 있고, 이를 통해 메모리의 효율적인 활용을 할 수 있게 한다.
1) append
sb.append("ABC") 와 같은 형태로 사용된다. sb라는 Stringbuilder 객체 안에 데이터를 추가한다.
append는 문자열의 끝에 추가된다.
2) insert
떄로는 이미 sb에 추가된 데이터의 특정 위치에 문자열을 추가하려고 할 때가 있을 것이다. 이 때 사용하는 것이 insert이다.
package StringBuilder;
public class main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("ABC");
sb.append("DEF");
sb.insert(3, " GH ")
System.out.println(sb); // ABCGHIDEF
}
}
0123456789 -> 0123456789
ABCDEF -> ABC GH DEF
insert의 3에 해당하는 3번째 위치인 E의 위치부터 " GH " 라는 문자열을 추가한다. 그리고 본래의 DEF는 그대로 밀린다.
3) setCharAt / replace
setCharAt 메소드는 CharAt // 즉 문자 하나만을 바꾼다. 따라서 작은 따옴표를 사용한다.
ex) sb.setCharAt(3, 'Z'); // ABCZEF
replace(시작점, 끝점, 바꾸려는 문자열) // 여기서 변경되는 부분은 시작점~끝점-1 까지 이다.
ex) sb.replace(3, 6, "GHI"); // ABCGHI
3번째 위치에 있는 D부터 5번째 위치의 구간까지 변경된다.
'Java' 카테고리의 다른 글
[Java] abstract, 자바의 추상 클래스, 추상메소드 개념 정리 (0) | 2022.02.08 |
---|---|
[Java] 자바의 예약어 총정리 (0) | 2022.02.08 |
[Java] 기초 문법 데이터 입력 및 형 변환, indexOf (0) | 2022.02.07 |
[Java] Call by Value 그리고 자바의 자료형 구조. (0) | 2022.01.09 |
[Java] 상수집합 enum 의 활용 (0) | 2022.01.07 |