Back-End/Java

[자바/JAVA] StringBuffer / StringBuilder

728x90

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)

 

append() 메서드

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:  문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우  

728x90