Java 문자열 String, StringBuffer, StringBuilder
Java의 문자열
Java에서 문자열을 다루는 대표적은 클래스는 String, StringBuffer, StringBuilder가 존재함
String vs StringBuffer, StringBuilder
String과 StringBuffer, StringBuidler의 가장 큰 차이는 String은 불변의 속성을 갖고, StringBuffer, StringBuilder는 가변의 속성을 갖는다
String
String str= "hello"; // String str = new String("hello);
str = str+ "world"; // [hello world]
위의 코드를 보면 “hello” 값을 가지고 있던 String 클래스의 참조변수 str이 가리키는 곳에 저장된 “hello”에 “world” 문자열을 더해 “hello world”로 변경한 것으로 착각할 수 있다.
하지만 기존에 “hello” 값이 들어가있던 String 클래스의 참조변수 str이 “hello world”라는 값을 가지고 있는 새로운 메모리영역을 가리키게 변경되고 처음 선언했던 “hello”로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(garbage collection)에 의해 사라지게 되는 것이다 String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성된 것
String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용 하면 좋은 성능을 기대할 수 있다. 하지만 문자열 추가,수정,삭제 등의 연산이 빈번하게 발생 하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성 되어 힙메모리가 부족으로 어플리케이션 성능이 떨어진다.
위의 String의 단점을 보완하기 위해 Java에서는 StringBuffer / StringBuilder 클래스를 도입
StringBuffer와 StringBuilder는 가변성을 가지고, 기존의 데이터에 더하는 방식을 사용하기 때문에 속도도 빠르며 상대적으로 부하가 적은 특징을 가지고 있다. .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능하다. 따라서 문자열의 추가,수정,삭제가 빈번하게 발생할 경우라면 String 클래스가 아닌 StringBuffer/StringBuilder를 사용하는게 좋다.
StringBuffer sb = new StringBuffer("hello");
sb.append(" world");
StringBuilder 사용 예제
public class TestEx {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("A");
// 문자열 추가
System.out.println(sb.append("B")); // AB
System.out.println(sb.append("C")); // ABC
// 문자열 삽입
System.out.println(sb.insert(0, "ko")); // koABC
// 문자열 치환, 문자열 교체
System.out.println(sb.replace(0, 1, "ye")); // yeoABC
// 인덱싱, 문자열 자르기
System.out.println(sb.substring(2)); // oABC
System.out.println(sb.substring(0, 4)); // yeoA
// 문자 삭제
System.out.println(sb.deleteCharAt(4)); // yeoAC
// 문자열 삭제
System.out.println(sb.delete(3, sb.length())); // yeo
// 문자열 변환
System.out.println(sb.toString()); // yeo
// 문자열 뒤집기
System.out.println(sb.reverse()); // oey
// 문자 대체, 문자 교체, 문자 치환
sb.setCharAt(1, 'b');
System.out.println(sb); // oby
// 문자열 길이 조정
sb.setLength(2);
System.out.println(sb); // ob
}
}
StringBuffer와 StringBuilder의 차이
가장 큰 차이점은 동기화의 유무로써 StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다(thread-safe). 참고로 String도 **불변성을 가지기때문에 마찬가지로 멀티쓰레드 환경에서의 안정성(thread-safe)**을 가지고 있다.
반대로 StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어나다.
정리
- String : 불변 객체이기 때문에 문자열 연산이 많은 프로그래밍이 필요할 때 계속해서 인스턴스를 생성하므로 성능이 떨어지지만 조회가 많은 환경 멀티쓰레드 환경에서 성능적으로 유리
- StringBuffer, StringBuilder : 문자열이 자주 발생할 때 문자열이 변경가능한 객체기 때문에 성능적으로 유리하고 StringBuffer와 StringBuilder의 차이는 동기화 지원의 유무이다. 동기화를 고려하지 않는 다면 StringBuilder가 성능이 더 좋고 동기화가 필요한 멀티쓰레그 환경에서는 StringBuffer가 유리하다.
Leave a comment