Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

Java String vs StringBuffer vs StringBuilder 본문

JAVA

Java String vs StringBuffer vs StringBuilder

개발자가되고싶어 2021. 8. 12. 01:05
String vs StringBuffer vs StringBuilder

 

Java에서 문자열을 다루는 세 가지의 class에 대해 알아보겠습니다.

 

우선 위의 세가지를 구분 지어 사용하는 이유에 대해 이해하기 위해선 memory 영역에 객체가 어떻게 할당되는지를 우선 알아야 할 필요가 있습니다.

String

public static void main(String[] args) {
    String st = "안뇽";
    st = st + "하세요";
}

위의 코드는 Memory 영역에 어떻게 할당될까요? 단순히 st 변수에 안뇽하세요 문자가 저장되니 문제가 없지 않을까요? 

String 객체는 불변의 객체입니다. 이제 메모리가 어떤 식으로 할당되는지 살펴봅시다.

Stack memory는 객체의 참조를 가지고 있으며 Heap memory의 String pool 영역은 같은 문자를 공유합니다. st 변수의 문자의 변경이 일어남으로써 안뇽 문자의 참조가 끊어졌습니다. String pool 영역의 문자 객체도 GC(Garbage Collection) 대상에 포함됩니다.

이것이 핵심입니다. 단순 문자를 덧붙였을 뿐인데 Heap memory의 String pool 영역에 쓸데없는 값이 쌓이고 있습니다. 

GC(Garbage Collection)가 수행되기 전까지는 불필요한 memory를 차지하는 것과 같습니다. 웬만한 경우는 문제가 없을 것이나 방대한 양의 문자열 처리가 필요하다면 분명 무시할 수 없는 memory 낭비가 될 것입니다.

 

StringBuffer & StringBuilder

둘의 사용법은 거의 같으며 차이는 thread-safe의 차이입니다. StringBuffer는 동기화됩니다. 그렇기 때문에 멀티스레드 환경에서 사용하며 StringBuilder는 동기화되지 않기 때문에 단일 스레드 환경에서 사용하면 됩니다. 멀티스레드 환경이 아니라면 StringBuilder를 사용합시다. 동기화 작업은 성능적으로 유리하지 못합니다.

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder("첫번째");
    sb.append("Builder");
    StringBuffer sbf = new StringBuffer("두번째");
    sbf.append("Buffer");
}

위의 코드는 메모리가 어떻게 할당될까요?

생성자를 통한 객체의 생성은 모두 Heap memory 영역에 따로 저장됩니다. 위의 방법은 String pool 영역이 아닌 별도의 영역에 생성됩니다.

결국 StringBuilder와 StringBuffer는 append 연산이 이루어져도 Heap memory 영역에 새로운 문자 객체가 할당되는 것이 아닌 기존의 문자 객체에 덧붙여진다는 것을 알 수 있습니다.

 

memory의 할당에 대해 안다면 차이를 정확히 이해할 수 있을 것이라 생각합니다.

'JAVA' 카테고리의 다른 글

Java Thread  (0) 2021.08.16
Java interface vs abstract(추상클래스) 차이  (0) 2021.08.11
Java 메모리 관리 stack 과 heap  (0) 2021.08.05
java Hashmap vs Hashtable  (0) 2021.08.03
java ArrayList, LinkedList  (0) 2021.07.30