CORE
HOME > JAVA > J2SE > CORE
2019.05.29 / 24:51

[클래스] String, StringBuilder, StringBuffer의 차이

탁돌이개발자
추천 수 5

C에서 문자열을 다루기 위해서는 char배열을 원하는 문자열의 길이만큼 선언해서 진짜 말그대로 '문자들의 배열'로 사용해야 했다. 반면 자바에서는 이런 번거로운 과정을 보이지 않고 문자열을 미리 만들어놓은 클래스가 있는데 이게 바로 String 클래스이다.

그런데 이 String이라는 것은 immutable의 속성을 지닌다. 무슨 뜻이냐하면 바로 더해지거나 빼지는 등 계산이 불가능한 변경불가 값 이라는 얘기이다.
쉽게 다음의 예를 들어보자.

int i = 3; String s = "3"; System.out.println(i+1); System.out.println(s+1);

두 값에 모두 1씩을 더했다. 결과는 어떻게 될까?

예외처리는 할 필요 없다

보다시피 int에 대한 연산 결과는 3+1 = 4가 되지만, String에 대한 연산 결과는 단순히 3뒤에 1을 이어붙인 31이 출력 되었다.
이와같은 속성을 바로 String immutable이라 하는 것이다.

그런데 만약 다음과 같이 우리가 해당 String값 뒤에 문자를 계속 붙여가며 새로운 문자를 완성해야 하는 상황에 있다고 해보자.

String alphabet = ""; //알파벳 완성시키기. 처음엔 아무것도 없는 값 for(int i=97; i<123;i++) { //(char)97 = 'a', (char)122 = 'z' alphabet+=(char)i; //+연산자를 이용해 alphabet객체 뒤에 계속 이어붙이기 } System.out.println(alphabet); //이어붙인결과 출력

물론 실행 결과는 잘 나온다.
그러나 이 코드가 어떻게 돌아가는 것인지 알아본다면 이 방법을 잘 쓰지 않게 될 것이다.

돌아가는 방식은 바로 아래와 같다

즉, +연산자를 수행해 문자를 붙일 때 마다 매번 이전 값은 쓰레기 값이 되어 가비지 컬렉터에 의해 회수되고, 새로운 값이 생성되는 것이다.

쉽게말하면 매번 새로 만든다는 얘기이다. 대충 생각해봐도 얼마나 비효율적인지 알 수 있다.


그렇다면 이 비효율적 문제를 해결할 방법이 없을까?
이는 바로 StringBuilder 클래스와 StringBuffer클래스를 이용해 해결할 수 있다.

두 클래스 모두 String클래스의 메소드를 오버라이딩 한 것으로 String클래스와는 다르게 mutable한 성질을 지닌다.
사용 방법은 아래와 같다.

StringBuilder alphabet = new StringBuilder(); //StringBuilder객체 생성 for(int i=97; i<123;i++) { alphabet.append((char)(i)); //append를 이용해 이어붙임 } System.out.println(alphabet);

과연 이게 무엇이 다를까? 바로 속도이다. 이전에는 새로운 객체를 매번 생성해 내는 과정이였지만 StringBuilder는 말그대로 append() 메소드를 이용해 진짜로 뒤에 계속 이어붙이는 방식이다.


그렇다면 StringBuffer는 무엇이 다를까? 일단 대체적으로 StringBuilder와 동일하지만 한가지 차이점이 있다면 바로 동기화가 가능하다는 것이다. 따라서 멀티쓰레딩을 하는 프로그램을 작성할 때는 StringBuffer를 사용하는 것이 낫다. 사용 방법은 아래와 같다.

StringBuffer alphabet = new StringBuffer(); //StringBuffer 객체 생성 for(int i=97; i<123;i++) { alphabet.append((char)(i)); //StringBuilder와 동일하다. } System.out.println(alphabet);


이제 속도비교의 차례인데 알파벳 26자는 너무 짧다. 따라서 공백 뒤에 1~100,000까지 이어붙이는
코드를 짜서 속도를 비교해보도록 하자


보다시피 속도차이가 극명하다.(StringBuffer가 동기화 관련 요소 때문에 StringBuilder보다 약간 느리다.)
따라서 단순히 스트링 뒤에 문자나 문자열 등을 이어 붙여야 되는 경우는 +연산자 보다는 StringBuilder나 StringBuffer를 이용하도록 하자.