메이쁘

[JAVA] String, StringBuilder, StringBuffer 의 차이점 본문

Language/JAVA

[JAVA] String, StringBuilder, StringBuffer 의 차이점

메이쁘 2020. 4. 6. 12:41

 

자바에서 문자열 처리(관리)를 하게 되면

 

가장 많이 쓰이는 String, StringBuilder, StringBuffer 세 클래스가 존재합니다.

 

 

각각에 대해 개념을 짚고, 어디서 사용하고 어떻게 사용하는 것이 좋은지에 대해

 

적어보려 합니다.

 

 

 

 

String


변수 타입 중 하나인 String.

 

대표적으로 String은 immutable(불변성) 의 특징을 가지고 있습니다.

 

 

즉, 잘 변하지 않는다는 것인데요.

 

 

변하지 않는다는 것은

 

해당 String 변수에 어떤 값이 들어간 다음

다른 값이 추가되거나 들어있는 값을 삭제하는 등

 

값의 추가/삭제가 이뤄지지 않는다는 것입니다.

ㅇ???

 

물론 값의 추가/삭제가 아예 불가능 한 것은 아닙니다.

 

-> String a = "hello";

-> a = a + "World";

하면 a = "helloWorld"가 되니까요.

 

 

좀 더 자세하게 들어가면,

String a 라는 변수의 값을 담기 위해 메모리를 할당합니다.

 

그래서 처음에 String a = "hello" 에서 "hello" 값이 담긴 메모리가 생성되고,

이 메모리 주소를 가리키는 String 변수 a가 만들어 집니다.

 

여기서 "World" 라는 문자열을 더해주게 되면

기존의 생성된 메모리에 값이 추가되는 것이 아닌

 

"helloWorld"라는 값을 가진 새로운 String 객체를 만들고, 이에 맞게 새로운 메모리를 할당받는 것 입니다.

 

그러면 기존의 "hello" 가 담긴 메모리 공간은 자동적으로 garbage(쓰레기)가 되서 언젠가 비워지겠죠.

 

 

 

한 두 번 간단한 연산 정도야

요즘 메모리나 모든 기기의 성능이 좋아져서 

느려지거나 공간이 부족해질 정도는 아니지만

 

문자열 연산 작업이 많게 되면 

좋지 않겠죠!?

 

 

그래서 이러한 문자열 연산 작업이 많을 경우에는

String 보다는 StringBuilder, StringBuffer 를 사용합니다.

*** 코테 문제를 풀 때 속도나 메모리 사용을 줄이기 위해 씁니다.

 

 

---> 정리하자면

 

String

 - 문자열 처리 및 관리하는 클래스.

 - immutable(불변성)의 특징이 있어 문자열 연산 작업 시 비효율적. (단순 작업은 큰 영향 없음)

 

장점

 - 간단하게 사용 가능함.

 - Thread-safe (동기화 신경쓰지 않아도 되서 안전함)

 - 단순 조회나 자주 사용하는 경우에는 빠르게 읽을 수 있어 다른 클래스들보다 좋다.

 

단점

 - 연산 작업에 쓰기에는 효율이 떨어짐.

 

 

 

 

 

 

StringBuilder, StringBuffer


이 두개는 String 클래스와는 다르게 mutable(가변성) 의 특징을 가지고 있습니다.

 

 

메모리가 고정 할당 되는 String과는 다르게

문자열이 추가/삭제 될 때 버퍼 크기를 늘리거나 줄이는 등 메모리를 유동적으로 사용하기 때문에

 

 

연산 시 새로 메모리를 찍어내는 String 클래스보다

성능이 좋다고 하는 것입니다.

 

 

오호..

그럼 StringBuilder와 StringBuffer의 차이는 뭐지??

 

 

실행 환경에 따라 다르다는 것이다.

 

 

StringBuilder : NOT Thread-safe.  싱글 쓰레드 환경에서 적합함.

StringBuffer : Thread-safe. Synchronized 존재하기 때문에 멀티 쓰레드 환경에서 적합함.

*** 다른 환경에서 쓴다고 문제가 되는 것은 아니고, 성능 면에서 차이가 난다 라고 보면 됨.

 

 

 

https://12bme.tistory.com/42 님의 말 :

String은 짧은 문자열을 더할 경우 사용합니다.

StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.

StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다.

 

정리


String

 - immutable(불변성).

 - 문자열 연산 작업 시 새로운 메모리를 할당시킴.

 - 그래서 문자열 연산 시 효율 낮음. 

 - 단순 조회나 간단한 연산 작업 시 좋음.

 

StringBuilder

 - mutable(가변성).

 - 문자열 연산 작업 시 동적으로 버퍼 크기를 늘림.

 - 그래서 문자열 연산 시 효율 좋음.

 - NOT Thread-safe

 - 씽글 쓰레드 환경에 좋음

 

StringBuffer

 - mutable(가변성).

 - 문자열 연산 작업 시 동적으로 버퍼 크기를 늘림.

 - 그래서 문자열 연산 시 효율 좋음.

 - Thread-safe. 

 - synchronized(동기화) 탑재

 - 멀티 쓰레드 환경에 좋음

 

 

 

 

 

 

감사합니다.

 

Comments