StringBuffer와 StringBuilder는 무엇이며, 어떻게 사용할까?
StringBuffer 클래스
--
StringBuffer 클래스는
"가변 길이 문자열"을 다루기 위한 클래스로
String 클래스와 달리 문자열을 수정할 수 있다.
String 클래스는 "불변"으로 지정한 문자열을 수정할 수 없지만
StirngBuffer 클래스는 "가변"으로 지정한 문자열을 언제든 수정할 수 있다.
내부적으로 문자열을 편집하기 위한 "버퍼(buffer)"를 가지고 있으며,
StringBuffer 객체를 생성할 때 해당 버퍼 크기를 지정할 수 있다.
버퍼의 크기는 이후 편집할 문자열의 길이를 고려하여 넉넉하게 잡아주는 것이 좋다.
만약 문자열을 편집할 때 버퍼 길이를 넘어가게 되면
다시 버퍼의 길이를 늘여주는 추가 작업이 필요하여 작업 효율이 떨어질 수 있다.
StringBuffer 클래스 또한 String클래스와 같이 문자열을 저장하기 위한
char타입 배열의 참조변수를 객체 변수로 선언하여 사용한다.
(여기서 char타입 배열은 버퍼를 의미한다.)
java 9부터는 String 클래스에서 메모리 효율을 개선하기 위해 char[] 대신 btye[]를 사용하여 문자열을 저장한다.
하지만 StringBuffer는 String 클래스와 달리 "가변"으로 문자열을 관리해야 하며,
멀티스레드 환경에서도 일관성을 유지할 수 있어야 하기 때문에
여전히 char[]을 그대로 사용하도록 설계되어 있다.
StringBuffer 생성자 형태 [예시 코드]
public StringBuffer (int length) { // 버퍼크기 선언
value = new char[length];
shared = false;
}
public StringBuffer() { //버퍼크기 지정하지 않으면 기본으로 16
this(16);
}
public StringBuffer (String str) { //지정한 문자열의 길이보다 +16해서 생성됨
this(str.length() + 16); //보통 문자열크기의 두배로 지정해준다.
append(str);
}
StringBuffer 객체 생성 및 수정 흐름
1. StringBuffer 객체 생성
StringBuffer sb = new StringBuffer("abc");
2. sb객체에 다른 문자열 추가(결합)하기
sb.apped("123"); // 문자열 추가하는 메서드
apped() 메서드는 반환타입이 StringBuffer이며, 호출한 객체(sb)의 값(주소)을 반환한다.
sb객체는 0x100 참조값을 가지고 있어, 해당 참조값(0x100)을 반환하여 sb2객체에 담기게 된다.StringBuffer sb2 = sb.append("AA");
즉, sb와 sb2객체는 같은 메모리 공간을 참조하게 된다.
StringBuffer의 비교
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb1 == sb2); // false
System.out.println(sb1.equals(sb2)); // false
StringBuffer 클래스는 equals()메서드를 오버라이딩하지 않아서
equals()메서드를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과가 나온다.
하지만 toString()메서드는 String 클래스처럼 오버라이딩이 되어있어서
StringBuffer 객체에 toString()을 호출하여 내부 문자열을 추출한 다음 비교하면 된다.
String str1 = sb1.toString(); // str1 = "abc"
String str2 = sb2.toString(); // str2 = "abc"
System.out.println(str1.equals(str2)); // true
즉, String 타입으로 문자열을 뽑아서 비교하는 방법이다.
--
StringBuffer 클래스의 주요 메서드
--
--
StringBuilder 클래스
--
StringBuilder 클래스는 StringBuffer 클래스와 동일한 클래스라고 생각하면 된다.
"가변" 문자열을 다루는 것과 제공하는 메서드도 거의 동일하지만
둘의 차이점은 멀티스레드에 대한 동기화 처리를 하나 안 하나 차이다.
StringBuffer는 멀티스레드에 대해 안전하도록 동기화 처리를 하지만
StringBuilder는 동기화 처리를 하지 않는다.
StringBuffer는 동기화를 하기 때문에 성능이 떨어지기 때문에
StringBuffer에서 스레드의 동기화 기능만 뺀 버전인 StringBuilder를 추가했다.
간단하게 생각하면
멀티스레드 프로그램에서는 StringBuffer클래스를,
싱글스레드 프로그램에서는 StringBuilder클래스를 사용하면 된다.
--
'Language > Java' 카테고리의 다른 글
[java.lang] Math 클래스 (수학적 계산 관련 클래스) (0) | 2024.11.05 |
---|---|
[java.lang] Wrapper 클래스 (기본형 객체 관련 클래스)(+오토박싱, 언박싱) (1) | 2024.11.04 |
[java.lang] String 클래스 (불변 문자열 관련 클래스) (0) | 2024.10.31 |
[java.lang] Object 클래스 (객체 관련 클래스) (0) | 2024.10.31 |
java.lang 패키지 (1) | 2024.10.29 |