StringBuffer 와 StringBuilder
StringBuffer와 StringBuilder는 둘다 문자열을 다루는 클래스입니다.
String으로 문자열을 저장하여 사용할 경우, 문자열에 변형이 있을 때 마다 새로운 Constant가 생성되는 문제가 있기 때문에 메모리 관리에 문제가 생기게 됩니다. 이를 방지하기 위한 방법으로 StringBuffer 와 StringBuilder 두가지 클래스를 사용합니다. 두 클래스는 가변성을 가지기 때문에 .append(), .delete() 메소드를 이용해 문자열의 수정이 가능합니다.
- StringBuffer, StringBuilder의 공통 주요 메소드
- append(값) StringBuffer, StringBuilder 뒤에 값을 붙인다
- insert(인덱스, 값) 특정 인덱스부터 값을 삽입한다
- delete(인덱스, 인덱스) 특정 인덱스부터 인덱스까지 값을 삭제한다
- indexOf(값) 값이 어느 인덱스에 들어있는지 확인한다
- substring(인덱스, 인덱스) 인덱스부터 인덱스까지 값을 잘라온다
- length() 길이 확인replace(인덱스, 인덱스, 값) 인덱스부터 인덱스까지 값으로 변경
- reverse() 글자 순서를 뒤집는다
두가지를 사용할 때 고려할 점
- StringBuffer는 공통 메소드가 동기화되므로 멀티 쓰레드 환경에서는 StringBuffer를 사용하는 것이 안전하고 (값이 예상치 못하게 변경되는 것 방지) 그 외에는 StringBuilder가 성능이 뛰어나기에 StringBuilder를 사용해주면 된다
String이 아닌 StringBuffer, StringBuilder를 사용해야 하는 이유?
- String은 constant Pool을 사용하기 때문에 변형이 생기면 새로운 constant가 생성됩니다. 한번 생성되면 할당된 메모리 공간이 변하지 않기때문에 내용이 1000번 바뀌면 새로운 constant가 1000개 생기는 것이죠. 이렇게 만들어진 문자열은 가비지 콜렉터에 의해 제거되야 하는데, 언제 제거될지 모른다는 단점이 있습니다.
- 하지만 이러한 특징 덕분에 단순한 읽기 연산을 하는 경우 빠르게 읽을 수 있고, 멀티쓰레드 환경에서 동기화를 신경쓰지 않아도 된다는 장점이 있습니다.
- 문자열의 변형이 많은 연산에서는 StringBuffer, StringBuilder를 사용합니다. 이 두가지는 버퍼에 계속 쌓아두다가 마지막에 constant를 생성하기 때문에 버퍼 크기를 늘려가며 유연하게 동작할 수 있습니다.
- 두가지의 차이점은 바로 동기화 여부입니다. StringBuffer는 각 메서드별로 synchronized키워드가 존재하여 멀티스레드 환경에서도 동기화를 지원하지만, StringBuilder는 지원하지 않습니다.
- 정리하자면,
- String은 짧은 문자열을 더할 경우 사용합니다.
- StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.
- StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다.
- 이러한 특징을 가지고 String은 불변(immutable)하고 StringBuffer와 StringBuilder는 가변(mutable)하다라고 합니다.
- 두가지는 성능으로만 따졌을 때는 2배 정도의 속도 차이가 있습니다. 하지만 , append() 연산이 약 1억6천만 번 일어날 때 약 2.6초 정도의 속도차이이기 때문에 문자열 연산이 엄청나게 많이 일어나지 않는 환경이라면 StringBuffer를 사용하여 스레드에 안전하도록 하는것이 바람직합니다.
'JAVA' 카테고리의 다른 글
proxy 패턴 (0) | 2021.09.07 |
---|---|
디자인 패턴 (0) | 2021.08.06 |
Object 클래스 - 메서드 (0) | 2021.08.05 |
Constant Pool (0) | 2021.08.05 |
자바 환경설정 - JDK 버전 바꾸기 (0) | 2021.08.04 |