Java

[Java] StringBuilder 가 필요한 이유, String의 불변객체

Rachel_ 2022. 2. 7. 16:40

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번째 위치의 구간까지 변경된다.