자바에서 StringBuffer와 StringBuilder의 차이점에 대해서 알아볼게요.
문자열 조합을 할 때 프로그램 성능을 위해 String 대신에 사용하는 대표적인 두 클래스입니다.
StringBuffer
- Thread-Safe 함
StringBuilder
- Thread-Safe 하지 않음
- StringBuffer보다 성능이 좋음
그럼 멀티쓰레드 환경에서는 StringBuilder를 아예 쓰면 안되는 것일까요?
예제를 통해 알아볼게요.
멀티쓰레드 환경에서 StringBuilder를 쓰면 안되는 예
이렇게 전역변수로 StringBuilder를 선언하면 여러 쓰레드에서 동시에 접근하게되고 StringBuilder는 쓰레드에 안전하지 않기 때문에 자연스럽게 문제가 생깁니다.
이런 코드를 써야할 경우가 있다면 StringBuffer를 사용해야해요.
public class Service {
static StringBuilder sb = new StringBuilder();
public void do() {
sb.append("추가");
sb.append("추가");
}
}
멀티쓰레드 환경에서 StringBuilder를 써도 되는 예
지역변수로 StringBuilder를 선언하면 쓰레드가 메소드를 수행할 때 객체가 생성되고 쓰레드마다 서로 다른 객체를 사용하게 되요. 그렇기 때문에 멀티쓰레드 환경에서 아래와 같이 코딩을 하여도 전혀 문제가 없고, 문자열 조합이 무지하게 많이 발생하는 경우 StringBuffer를 사용할 때보다 성능상으로 유리할 수 있습니다.
public class Service {
public void do() {
StringBuilder sb = new StringBuilder();
sb.append("추가");
sb.append("추가");
}
}
위에 밑줄친 문자열 조합이 무지하게 많이 발생한다는 정도는 짧은 문자열 기준으로 적어도 1만번 이상의 연산이 수행되어야 하는 정도에요. 1000만번 이상부터 차이가 확실히 난다라고 제시할 수 있는 수준인 것 같습니다.
연산이 많지 않은 경우는 StringBuffer나 StringBuilder나 차이가 거의 없으므로 굳이 성능적인 면 생각하지 않고 StringBuffer로 통일하여 써도 상관은 없어요. 기분의 차이?
'Backend > Java' 카테고리의 다른 글
자바 원격서버 파일 다운로드 (Java, Spring) (2) | 2019.12.31 |
---|---|
자바 쿠폰 랜덤 생성 (Java) (0) | 2019.12.26 |
자바 스택 (Java Stack) 기본 사용법 (0) | 2019.12.12 |
자바 비밀번호 암호화 (SHA256,SHA512) + Salt (2) | 2019.12.11 |
Java Stream 기초 설명 (코딩 테스트 예제로) (0) | 2019.12.05 |