티스토리 뷰

Overview

세 클래스는 전부 Java에서 String(문자열)을 저장하고 관리하는 클래스이다.
Java 프로그래밍을 할 때 문자열을 가장 많이 사용하는데, 자주 사용되는 클래스들의 쓰임새를 잘 알고 효율적으로 사용하는 것이 바람직해 보여 포스팅을 한다.

불변성(immutable) : 객체의 값이 할당된 Heap 영역의 값을 변경할 수 없다. 주소가 재할당 됩니다.
가변성(mutable) : 객체의 값이 할당된 Heap 영역의 값이 변경 가능합니다. 주소는 그대로 사용하고 값을 변경합니다.

String

String은 immutable(불변성) 합니다.
객체가 생성되면 할당된 메모리공간에 변화가 일어나지 않습니다.

    @Test
    public void testString(){
        String originText = "leo";
        String targetText = originText;
        originText = originText + "string";

        int beforeHashCode = originText.hashCode();
        int afterHashCode = targetText.hashCode();

        assertNotEquals(beforeHashCode, afterHashCode);
        assertNotEquals(originText, targetText);
    }

String은 주소값을 참조하지않고, 새로운 주소를 할당합니다.
Thread-safe하고 사용에도 심플하지만 문자열에 잦은 연산이 일어날 때는 GC에 부하를 줄 가능성이 있습니다. StringBuffer, StringBuilder를 사용하는 것이 적합합니다.

StringBuffer, StringBuilder

StringBuffer, StringBuilder는 mutable(가변성) 합니다.
객체가 생성된 후 할당된 값을 변경할 수 있다.

    @Test
    public void testStringBuilder(){
        String text = "leo";
        StringBuilder originStringBuilder = new StringBuilder(text);
        StringBuilder targetStringBuilder = originStringBuilder;
        originStringBuilder.append("string");

        int beforeHashCode = originStringBuilder.hashCode();
        int afterHashCode = targetStringBuilder.hashCode();
        assertEquals(beforeHashCode, afterHashCode);
        assertEquals(originStringBuilder.toString(), targetStringBuilder.toString());
    }

originStringBuilder에 값을 할당 한 후 targetStringBuilder 가 해당 객체를 참조한다.
originStringBuilder에 값이 변경되면 targetStringBuilder 의 값도 변경됩니다.

StringBufferStringBuilder에서 제공되는 함수는 동일합니다.
다만 동기화 여부 즉, Thread-safe에 차이점이 있습니다.

두 객체에서 가장 많이 쓰이는 append 메소드를 살펴보자. 아래의 이미지를 보면, StringBuffer에는 synchronized 키워드가 있고, StringBuilder에는 synchronized가 없는 것을 볼수 있다.

StringBuffer

StringBuffer의 append 메소드

StringBuffer는 동기화 여부를 관리하여 멀티스레드 환경에 적합합니다. 다만 동기화 여부에 신경쓰다보니 성능은 StringBuilder > StringBuffer 입니다.

StringBuilder

StringBuilder의 append 메소드

StringBuilder는 동기화 여부를 신경쓰지 않습니다. 멀티스레드 환경에 적합하지 않고, Thread-safe하지 않습니다.

'Programming > JAVA' 카테고리의 다른 글

Java Stream API 사용해보기  (407) 2021.05.25
Java NIO ByteBuffer 사용해보기  (0) 2021.04.22
Immutable Object(불변 객체)  (405) 2021.04.06
네이버 책 검색 OPEN API 활용하기  (820) 2016.06.23
[JAVA] TCP 1:1 채팅  (0) 2016.04.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
«   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
글 보관함
Total
Today
Yesterday