본문 바로가기
언어/JAVA

[JAVA] String, StringBuffer, StringBuilder

by 이민우 2021. 3. 30.
728x90
반응형

자바에서 문자열을 다룰 때, 대표적으로 String, StringBuffer, StringBuilder를 사용한다.

 

사실 데이터의 변경이 많지 않을 때, 즉 연산이 거의 없을 때는 위의 클래스 중 어느 클래스를 사용하여도 큰 문제는 없다.

하지만 세 개의 클래스는 분명 다른 목적으로 개발되었고, 그 차이점은 개발자 면접 질문에서 자주 출제되는 질문이다.

 

 

String은 원래 불변이다. 즉, 원래는 변할 수 없는 클래스이다.

하지만 Java에서 String은 변경이 가능하다.

String str = "abc";
str += "de";
System.out.println(str);

위처럼 코드를 구동해보면 출력은 abcde가 된다. 즉, 변할 수 있다.

 

하지만 그 변화하는 과정이 조금 비효율적이다. str을 선언할 때 메모리에는 "abd"를 위한 메모리 영역이 만들어진다. 그 후 "de"를 추가함으로써 str의 내용이 "abcde"가 되고, 이는 새로운 메모리에 저장된다.

그리고 원래의 "abc"는 메모리에 남아있다가, GC에 의해 추후 사라지게 된다.

 

이러한 점으로 많은 연산량에 요구될 때에는 위와 같은 가비지 메모리가 계속해서 메모리에 누적되고, 힙 메모리의 부족으로 어플리케이션의 성능을 떨어뜨릴 수 있다.

 


 

그에 반해 StringBuffer와 StringBuilder는 가변이다. 즉, 변할 수 있다.

String과 달리 위의 두 클래스는 append 함수와 delete 함수를 제공하고, 이를 이용하면 객체 내에서 문자열을 변경할 수 있다. 즉, 추가적인 메모리를 사용하지 않아도 내용을 변경할 수 있다.

 

이러한 점으로 인해 데이터의 연산량이 많다면 StringBuffer 혹은 StringBuilder를 사용하는 것이 좋다.

 


 

또한 StringBuffer와 StringBuilder도 차이점이 존재하는데, 이는 동기화의 지원 여부이다.

String의 경우에는 기본적으로 불변성을 가지기 때문에 다른 쓰레드가 값을 변경할 수 없고, 이러한 점으로 인해 멀티 쓰레드 환경에서도 안전하다.

 

그에 반해 가변성을 가진 위의 클래스들은 다른 쓰레드에 의해 값의 변경이 가능하다. 이를 방지하기 위해 StringBuffer는 동기화를 지원한다. 즉 서로 다른 쓰레드의 동시 접근을 허용하지 않음으로써 멀티 쓰레드 환경에서 안정성을 제공해준다.

 

반대로 StringBuilder는 동기화를 지원하지 않기에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만, 멀티 쓰레드를 전혀 고려하지 않았기에 단일 쓰레드에서의 성능이 StringBuilder에 비해 뛰어나다.

728x90
반응형

'언어 > JAVA' 카테고리의 다른 글

[JAVA] == vs equals vs hashCode  (0) 2021.03.30
[JAVA] Garbage Collection (GC)  (0) 2021.03.30
[JAVA] BufferedReader와 Scanner  (0) 2021.03.30
HashSet  (0) 2020.10.27
[JAVA][ARRAYS] 배열 비교  (0) 2020.05.26