[ JAVA ] 문자열클래스 / String / StringBuffer / StringBuilder
자바( JAVA ) 에서 문자열을 다루는 대표적인 클래스
연산이 많지 않을때는 어떤 클래스를 사용하더라도 문제 없지만
연산횟수가 많아지거나 복잡한 상황에서 특징에 알맞게 적절한 클래스를 사용해보자
String 클래스
• 불변성을 갖는다. ( 변하지 않는 문자열을 자주 사용하는 경우에 좋은 성능 )
• 한번 생성되면 할당된 메모리 공간이 변하지 않는다.
• concat 메서드 혹은 +연산자를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도
기존 문자열에 새로운 문자열을 붙이는것이 아니라, 새로운 String객체를 만든 후 새로운 String
객체에 연결된 문자열을 저장하고 그 객체를 참조하도록 한다.
String Str = " Hello "; // String Str = new String( "Hello" );
Str = Str + " World "; // [ Hello World ]
• String 클래스 객체는 Heap 메모리영역( 가비지 컬렉션 동작 영역 ) 에서 생성하고 한번 생성된 객체의
내부 내용을 변화시킬 수 없다.
• 문자열 연산( 문자열 추가 , 수정 , 삭제 등 ) 이 많은 경우 Heap메모리에 많은 임시 가비지가 생성되어
Heap 메모리 부족으로 성능이 좋지 않다.
StringBuffer 클래스 / StringBuilder 클래스
• 가변성을 가지고 있다.
• API를 이용하여 동일 객체내에서 문자열을 변경하는 연산이 가능하다.
• 문자열 연산( 문자열 추가, 수정, 삭제 ) 이 많은 경우에는 StringBuffer / StringBuilder 클래스를 사용해야 한다.
• StringBuffer / StringBuilder 클래스가 제공하는 메서드는 동일하다.
StringBuffer sb = new StringBuffer( "Hello" );
sb.append( "World" );
• 차이점
"동기화의 유무" 에서 차이점을 보인다.
StringBuffer는 각 메서드별로 Synchoronized Keyword가 존재, 멀티스레드 환경에서 동기화를 지원한다.
하지만, StringBuilder는 동기화를 보장하지 않는다.
( 멀티스레드 환경에서는 StringBuffer를 사용 , 단일스레드 환경에서는 StringBuilder를 사용 )
최종 정리
• String 클래스
- 문자열 연산이 적고 멀티쓰레드 환경일 경우
- 짧은 문자열을 더할 경우
• StringBuffer 클래스
- 문자열 연산이 많고 멀티쓰레드 환경일 경우
- 개발중인 시스템의 부분이 쓰레드에 안전한지 모를 경우
• StringBuilder 클래스
- 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 될 경우
- 쓰레드에 안전한지 여부가 전혀 관계없는 프로그램 개발시