StringBuffer란?
String 클래스와는 다르게 StringBuffer 클래스는 인스턴스의 값을 변경할 수 있는 가변 클래스(mutable class)이다.
StringBuffer는 내부적으로 버퍼라는 독립적인 공간을 가지는데 기본값은 16이다 (문자 16개 저장 가능)
물론 생성자를 통해 버퍼의 크기를 설정해줄 수도 있다.
String으로 문자 결합 시 새로운 인스턴스가 계속해서 생기기 때문에 메모리 공간도 낭비되고 속도도 느려지게 되는데
StringBuffer 클래스는 기존 인스턴스에 문자열을 추가할 수 있기 때문에 공간 낭비도 없고 속도도 빨라집니다.
StringBuffer에서 append() 메서드를 통해서 문자열을 추가할 수 있습니다.
StringBuffer sb = new StringBuffer("01");
sb.append("23").append("45"); // result: 012345
위의 코드에서 append()를 연속해서 사용할 수 있는 이유는 append() 메서드가 자기 자신의 인스턴스를 리턴하기 때문이다.(return this)
StringBuffer값 비교
문자열을 비교하는 방법에는 ==, equals()가 있는데 StringBuffer에서는 문자열 비교 시 조금 더 번거로울 수 있다.
StringBuffer에서는 equals() 메서드가 오버라이딩 되어있지 않기 때문에 ==와 equals()가 같은 결과를 출력한다.
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println("sb1 == sb2 ? " + (sb1 == sb2)); // false
System.out.println("sb1.equals(sb2) ? " + (sb1.equals(sb2))); // false
정확한 비교를 하기 위해서는 toString() 메서드를 이용해서 String 인스턴스를 리턴 받은 후 비교를 해주면 된다.
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
String s1 = sb1.toString();
String s2 = sb2.toString();
System.out.println("s1 == s2 ? " + (s1 == s2)); // false
System.out.println("s1.equals(s2) ? " + (s1.equals(s2))); // true
StringBuilder와 StringBuffer의 차이점 ✨
StringBuffer는 동기화를 지원하기 때문에 멀티쓰레드 환경에서도 안전하지만
StringBuilder은 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 쓰기에는 적합하지 않습니다.
단, 단일 스레드 환경에서는 StringBuilder가 성능이 StringBuffer보다 더 뛰어납니다.
정리 ⭐️
각 상황에 따라 무엇을 사용할지에 대한 정리입니다.
String: 문자열 연산이 적고 멀티쓰레드 환경일 경우
StringBuffer: 문자열 연산이 많고 멀티쓰레드 환경일 경우
StringBuilder: 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우
'Back-End > Java' 카테고리의 다른 글
[Java/자바] BigDecimal 정리 (0) | 2021.05.14 |
---|---|
[자바/JAVA] 래퍼 클래스(Wrapper Class) (0) | 2021.02.02 |
[자바/JAVA] String 클래스 (0) | 2021.02.01 |
[자바/JAVA] 문자열 분리 (StringTokenizer) 🔥 (0) | 2021.02.01 |