Java에서 문자열을 다루는 대표적인 클래스로 String
, StringBuffer
, StringBuilder
가 있다.
연산이 많이 않을때는 특별한 이슈가 발생할 가능성이 거의 없지만, 연산횟수가 많아지거나 멀티스레드, 경쟁 상태(Race Condition) 등의 상황이 자주 발생하면 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해야 한다.
String
과 StringBuffer
와 StringBuilder
의 기본적인 차이는 String
은 불변(Immutable), StringBuffer
와 StringBuilder
는 변함(Mutable) 이다.
string 객체는 한번 생성됨면 할당된 메모리 공간이 변하지 않는다.
concat
메서드 또는 + 연산자를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라 새로운 String 객체를 만든 후 새 String 객체에 연결된 문자열을 저장하고 그 객체를 참조하도록 하는 것이다.
즉, String 클래스 객체는 Heap 메모리 영역에 생성하고 한번 생성된 객체 내부 내용을 변화시킬 수 없다.
String 객체는 문자열 연산이 많은 경우 성능이 좋지 않다
String str = "Hello"; // 메모리에 Hello 담는다.
str = str.concat(" World"); //기존 메로리 Hello에 값을 붙이는 것이 아니라 새로운 메모리에 Hello World를 담는다.
StringBuffer와 StringBuilder는 String과 다르게 동작한다.
문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리면 유연하게 동작한다. StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일하다.
StringBuffer | StringBuilder | |
---|---|---|
동기화 | 동기화 보장 o | 동기화 보장 x |
StringBuilder sb = new StringBuilder();
sb.append("Hello"); // 기존 메모리를 늘려 Hello 추가
sb.append(" ").append("world") // 기존 메모리를 늘려 " "와 "world" 추가
보통 사용할 떄 String을 사용하고,
출력값이 많아지거나 String에서 + 연산자나 , concat() 메서드 사용이 많아진다면 StringBuilder를 사용하자!