Java로 코딩 테스트를 준비하다 보면 문자열 문제를 많이 마주한다.
이때, 기본 String을 사용하기도 하지만 StringBuilder와 StringBuffer를 사용하는 경우도 많다.
이 두가지에 대해 알아보도록 하자!
String
String과 2개 클래스의 차이를 보면 불변함의 차이가 있다.
String : 불변(immutable)
String 객체는 한 번 생성되면 할당된 메모리 공간이 변하지 않는다.
즉, +연산을 사용했을 때 기존의 문자열에 문자를 덧붙이는 것이 아니라 덧붙여진 새로운 String 객체를 만드는 것이다.
이것은 메모리 측면에서 굉장히 비효율적이다.
위와 반대로 간단하게 사용하거나, 동기화에 대해 신경쓰지 않아도 되는 경우에는 불변함이 장점이다.
자바에서 String은 Heap 영역에 생성되며 ""으로 String 객체를 생성하면 같은 주소로 Constant Pool에서 관리된다.
불변성이라는 특징때문에 문자열에 +연산을 사용하면 기존 문자열에 덧붙이는 것이 아니라 계속 덧붙여진 새로운 객체를 만든다.
String s1 = "java";
String s2 = "java";
String s3 = new String("java");
아래 그림을 보면 s3과 달리 s1과 s2는 동일한 주소를 가리키며 Constant Pool에 존재한다.
StringBuffer vs StringBuilder
StringBuilder, StringBuffer : 기존 버퍼 크기를 늘리면서 유연하게 동작한다. 변함(mutable)
StringBuffer와 StringBuilder의 차이점은 멀티스레드 환경에서의 안정성이다.
StringBuffer
- Thread-Safe하다.
- 가변적이다.
- 동기화를 지원한다. -> 오히려 나쁜 성능을 보일 수 있다.
- 참조가 많은 경우 사용하면 좋다.
- ex) 아래와 같은 경우엔 전역 변수로 선언해 여러 스레드에서 동시에 접근하기 때문에 StringBuffer를 쓰는 것이 좋다.
public class Test {
static StringBuffer sb = new StringBuffer();
public void method() {
sb.append("1");
sb.append("2");
}
}
StringBuilder
- 동기화를 지원하지 않아 Thread-Safe하지 않지만, StringBuffer보다 연산처리가 빠르다.
- 가변적이다.
- 멀티 스레드 환경에서 문제가 발생될 수 있다.
- ex) 아래와 같은 경우엔 메서드를 실행할 때마다 스레드가 다른 객체를 사용해 StringBuilder를 사용하는 것이 좋다.
public class Test {
public void method() {
StringBuilder sb = new StringBuilder();
sb.append("1");
sb.append("2");
}
}
성능비교
String, StringBuilder, StringBuffer 이 세가지의 성능 차이를 프로그래머스 문자열 문제를 통해 확인해 보겠다.
사용한 문제 : https://programmers.co.kr/learn/courses/30/lessons/83201
1. String 사용했을 때
2. StringBuilder 사용했을 때
3. StringBuffer 사용했을 때
결론은 위에서 설명한 대로 String은 연산할 때마다 새로운 객체를 만들어 속도가 제일 느리고, StringBuilder의 연산 속도가 제일 빠르다. StringBuffer도 빠르긴 하지만, 동기화를 지원하기 때문에 StringBuilder보다 약간 느리다.
참고
https://limkydev.tistory.com/119
'Java' 카테고리의 다른 글
[Java] 인터페이스 (0) | 2021.08.07 |
---|---|
[Java] Object(toString(), equals(), hashCode()) (0) | 2021.08.03 |
[Java] Solid란? (0) | 2021.07.28 |
[Java] 다형성, 캐스팅, 추상 클래스, 추상 메서드 (0) | 2021.06.22 |
[Java] 상속, final, 자동 형변환 (0) | 2021.06.22 |