컴공생의 다이어리
[자바, Java] 문자열 - String, StringBuffer, StringBuilder 본문
String, StringBuffer, StringBuilder
Java에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있다.
String
String 클래스는 StringBuffer, StringBuilder 클래스와 다르게 한번 생성되면 할당된 메모리 공간이 변하지 않는다는 불변의 속성을 가지고 있다.
String str = "hello"; // String str = new String("hello");
str = str + " world"; // [ hello world ]
위의 예제는 str에 처음 "hello" 값을 넣고 두번째 문장에서 str이 "hello world"라는 값을 가지고 있는 새로운 메모리 여역을 가리키게 변경되고 처음 선언했던 "hello"로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(Garbage Collection)에 의해 사라지게 된다. String 클래스는 불변하기 때문에 문자열을 연결하면 기존의 String에 연결되는 것이 아닌 수정하는 시점에 새로운 String 인스턴스가 생성되는 것이다.
이처럼 String은 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주면 좋은 성능을 기대할 수 있다. 하지만, 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생한다면 String 클래스는 힙 메모리에 많은 임시 Garbage가 생성되어 힙 메모리 부족으로 어플리케이션 성능에 치명적인 영향을 끼칠 수 있다.
StringBuffer와 StringBuilder
StringBuffer와 StringBuilder 클래스는 String 클래스와 다르게 가변의 속성을 가진다. 내부적으로 가변적인 char[]를 멤버 변수로 가지며 문자열을 여러번 연결하거나 변경할 때 사용하면 유용하며 .append(), .delete() 등의 API를 사용하여 동일 객체 내에서 문자열을 변경하는 것이 가능하다.
StringBuffer sb= new StringBuffer("hello");
sb.append(" world");
StringBuffer와 StringBuilder는 동일한 API를 가지고 있지만 차이점이 있다. 바로 동기화의 유무이다. StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전한다. 반대로 StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는만큼 단일쓰레드에서의 성능은 StringBuffer보다 뛰어나다.
* String도 불변성을 가지기 때문에 멀티쓰레드 환경에서 안전성을 가지고 있음 *
String : 문자열 연산이 적고 멀티쓰레드 환경일 경우
StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 경우
StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우
https://dejavuhyo.github.io/posts/string-stringbuffer-stringbuilder/
https://ifuwanna.tistory.com/221
출처 : 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
'Development > Java' 카테고리의 다른 글
[자바, Java] Iterator 반복자 (0) | 2021.09.04 |
---|---|
[자바, Java] 제네릭(Generic) (0) | 2021.09.03 |
[자바, Java] 문자열(String) 비교 - ==과 equals() 차이 (0) | 2021.09.01 |
[자바, Java] 인터페이스(interface)의 상속 (0) | 2021.08.31 |
[자바, Java] 인터페이스(interface) (0) | 2021.08.30 |