티스토리 뷰

String 클래스와 StringBuffer, StringBuilder클래스의 차이

String은 불변이라는 특징을 가지고 있는 것이 StringBuffer, StringBuilder와의 가장 큰 차이점이다. 

JVM의 Heap 메모리 영역에는 String Pool이라는 것이 존재하는데
어떤 문자열을 사용하는데 String Pool에 동일한 문자열이 존재한다면 이를 재사용한다.
String str = "hello world";
str = "hello world and Hi!!!";

위 코드를 보면 str은 "hello world"로 정의한다. 그리고 아래에서 "hello world and Hi!!!" 라는 문자열로 변경한다. 

언뜻보면 str에 있는 내용을 수정하는 것처럼 보이지만 아니다. 참조를 변경하는 것 뿐이다. 

즉, String Pool에는 "hello world"와 "hello world and Hi!!!"라는 두개의 인스턴스가 생성되어있는 것이고 이 인스턴스에 대한 참조만 변경하는 것이다.

출처: codepumpkin

 

String 클래스의 문제점

불변의 특징을 가지고 있고 재사용까지 된다면 엄청 효율적인거 같다.

하지만 이 뜻은 사용하고자 하는 문자열이 조금만 변경되어도 다른 인스턴스가 생성된다는 뜻이다.

String str = "안녕하세요";
str = "안녕하세요.";

위 코드에서 str은 .(dot) 하나 때문에 다른 객체를 생성하고 참조하게되는 것이다.

즉, 문자열을 수정할 때마다 메모리에 새로운 문자열이 생성되고 쓰이지 않는 문자열은 메모리에 남아 쓸데없는 자리만 차지하게 된다. 그래서 문자열의 추가, 수정, 삭제 연산이 자주 발생하는 알고리즘에 대해서는 String 클래스를 사용하는 것을 지양해야 한다.

 

문자열 연산이 빈번하게 발생하는 알고리즘에서 사용해야하는 것이 StringBuffer, StringBuilder 클래스이다.

 

StringBuffer와 StringBuilder의 공통점

두 클래스 모두 처음 인스턴스를 생성할 때 넉넉한 메모리 공간을 확보하여 그 안에서 문자열을 저장하고 수정하도록 한다. 따라서 효율적으로 메모리를 관리 할 수 있다는 공통점이 있다. 멤버로 가지고 있는 메서드도 거의 동일하다.

 

StringBuffer와 StringBuilder의 차이점

두 클래스의 가장 큰 차이점은 스레드에 있어 안정성이다. StringBuffer는 동기화를 지원하기 때문에 멀티쓰레드 환경에서 안정성을 가진다. 하지만 StringBuilder는 동기화를 지원하지 않기에 멀티쓰레드 환경에서 적합하지 않다.

하지만 StringBuffer는 그만큼 더 많은 연산을 하기에 StringBuilder보다 비효율적이다.

 

따라서 멀티쓰레드 환경에서 문자열을 자주 변경해야하는 연산이 일어난다면 StringBuffer를 단일쓰레드 환경에서 쓰레드 안정성을 고려할 필요가 없다면 StringBuilder를 쓰는 것이 좋다.

출처:DigitalOcean

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함