티스토리 뷰

 과제로 나오기 전에는 StringBuilder와 StringBuffer의 차이에 대해 어렴풋이만 알고 있었다.

동기화 기능이 있는지의 차이, 그리고 해당 기능의 존재로 인한 속도 저하..

과제로 나오면서 다시 한 번 정확히 짚고 넘어가기로 했다.


String

먼저, Java에서 String은 불변객체입니다.

//Main.java
public class Main {
    public static void main(String[] args) {
        String s = "a";
        s = s + "b";
    }
}

불변객체이지만 위와 같이 변경이 되는 이유는 뭘까?

String은 객체이기 때문에, s+"b"의 값이 담긴 객체를 생성하고 해당 주소를 s에 담아주기 때문에 위의 방식이 가능한 것이다.

즉, 기존의 s와 이후의 s는 가르키는 메모리 영역의 주소가 다르다.

String을 통해 문자열을 이어붙일 경우, 메모리의 힙영역에 새로운 객체들이 생성되게 됩니다.

이것들은 추후 가비지 컬렉터가 작동하면서 삭제해주는데, 자원을 소비하게 됩니다.

아마 Java로 알고리즘 문제를 풀어본 분들은 문자열을 가지고 처리를 하는 부분들에서, StringBuilder를 사용한 후 최종 값에서 String으로 변환하는 방법을 사용할 것입니다. 이 이유에 대해서 알아보려고 합니다.


StringBuilder & StringBuffer

StringBuilder와 StringBuffer는 가변객체입니다.

둘은 모두 사이즈가 변할 수 있고, 사용 방법도 동일합니다.

//Main.java
public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("StringBuilder");
        System.out.println(sb.toString());
        
        StringBuffer sb2 = new StringBuffer();
        sb2.append("StringBuffer");
        System.out.println(sb2.toString());
    }
}

둘의 차이점은 멀티쓰레드 환경에서 동기화 기능 제공 유무입니다.

StringBuffer는 동기화 기능을 제공하기 때문에 멀티쓰레드 환경에서 안전합니다.(= thread safe)

StringBuilder는 동기화 기능을 제공하지 않기 때문에 멀티쓰레드 환경에서 안전하지 않습니다.

StringBuffer는 내부적으로 동기화 기능을 처리하기 위한 로직이 있어서 StringBuilder에 비해 속도가 느립니다.

따라서 Java언어로 알고리즘 문제를 풀 때에는, 동기화를 생각하지 않아도 되기 때문에 StringBuilder를 쓰는 것입니다.

 

속도 : (빠름)   StringBuilder > StringBuffer > String   (느림)

쓰레드 세이프 : String, StringBuffer

 

728x90
반응형
댓글
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함