티스토리 뷰

Java

[JAVA] String / StringBuffer / StringBuilder

cherishee 2020. 1. 10. 22:20

String vs StringBuffer/StringBuilder

String 과 StringBuffer/StringBuilder의 가장 큰 차이점은 String은 불변, StringBufferStringBuilder는 가변하다.

String

String은 한 번 값이 생성되면 그 값을 변경할 수 없다. 즉, Immutable (불변)하다고 한다. immutable 가장 큰 장점은 멀티쓰레드 환경에서 마음 놓고 사용할 수 있다. (변경할 수 없는 객체니까!)
toUpperCase(), trim()과 같은 메소드를 가지고 있어서 변경되는 것 처럼 보이지만 사실 해당 메소드들을 수행할 때 또 다른 String 객체를 생성하여 리턴하는 것이다.


String클래스의 참조변수 str에 "hello"값을 넣은 후 "world" 값을 추가하는 경우, 직관적으로 문자열을 더해 값이 "hello world"로 바뀐다고 착각할 수 있다. 하지만 기존에 "hello"값을 가지고 있는 참조변수 str이 "hello world"라는 값을 가지고 있는 새로운 메모리 영역을 가리키게 변경되는 것이다. 그리고 "hello"가 할당된 메모리 영역은 Garbage로 남아있다가 GC에 의해 사라진게된다. 즉, String 클래스는 불변하기 때문에 문자열을 수정하는 것은 새로운 String 인스턴스를 생성하는 것이다.


따라서 String은 변하지 않는 문자열을 자주 읽어들이는 경우 사용하는 것이 좋다. 반면에 문자열을 추가/수정/삭제 등 연산을 많이 하는 경우에는 힙 메모리에 많은 임시 Garbage가 생겨 성능 저하가 일어나기 때문에 사용을 자제하는 것이 좋다.

StringBuffer/StringBuilder

String의 문제를 해결하기 위해 가변성을 가지는 StringBuffer/StringBuilder이 있다.
StringBuffer/StringBuilder는 문자열 추가/수정/삭제 등 연산이 많이 일어나는 경우 사용한다.
(동일한 객체내에서 문자열을 변경하는 경우)

StringBuffer

StringBuffer는 String과 반대로 mutable(가변) 하다고 한다. 한 번 생성된 값을 언제든지 수정할 수 있다.
멀티쓰레드 환경에서 다른 값을 변경하지 못하도록 한다. 따라서 동기로 동작하는 경우에는 StringBuffer를 사용하는 것이 좋다. (Thread-safe 하다.)


StringBuilder

StringBuffer와 차이점은 동기화의 유무이다.
StringBuilder는 동기화를 지원하지 않는다. 그래서 단일쓰레드환경에서 사용하는 것이 좋다.

정리

String vs StringBuffer/StringBuilder의 가장 큰 차이점은 메모리가 사용되는 과정이 다르다.

String은 변경이 있을 때마다 새로 생성이 되고, StringBuffer는 값은 memory에 append하는 방식이기 때문에 새로운 객체를 직접생성하지 않는다. String 객체에 대해 변화가 있을 경우(더하기 등) String의 주소값들이 stack에 쌓이게 되고 GC가 호출되기 전까지 heap에 지속적으로 쌓이게 된다. 이러한 경우 메모리 관리적인 측면에서는 매우 비효율적이다.

그렇다면 StringBuffer만 사용하는 것이 좋은가?

그것은 상황에 따라 다르다. StringBuffer 자료형은 String 자료형보다 무겁다. StringBuffer를 사용하여 객체를 생성하는 것은 일반 String을 사용하는 것보다 메모리 사용량도 많고 속도도 느리다. 그래서 보통 문자열 변경등의 작업이 많을 경우에만 StringBuffer를 사용하고 문자열 변경 작업이 거의 없는 경우에는 그냥 String을 사용하는 것이 좋다고 한다.

StringBuffer, StringBuilder가 적절한 경우?

문자열 연산이 많을 때 두 클래스를 사용하지만 멀티 쓰레드 환경에서는 StringBuffer를 사용하고, 싱글 쓰레드 환경이거나 멀티 쓰레드이지만 동기화가 필요없는 경우에는 StringBuilder를 사용하는 것이 좋다.

참고 출처

'Java' 카테고리의 다른 글

[Java] char to int  (0) 2020.03.23
[Java] 객체 비교 (Comparator / Comparable)  (0) 2020.03.10
[Java] JVM  (0) 2020.03.03
[Java] Singleton  (0) 2020.03.03
[Java] Interface  (0) 2020.03.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함