String 클래스는 immutable(불변) 불변성을 가졌기 때문에 String 객체를 변경시 실제로 변경되는 것이 아닌 새로운 String 객체를 생성합니다.
즉, 지정된 문자열을 변경할 수 없습니다.
반면 StringBuffer/StringBuilder 클래스는 mutable(가변) 가변성을 가져, 동일한 객체내에서 문자열 변경이 가능합니다.
StringBuffer/StringBuilder 클래스의 차이점
StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있습니다.
그래서 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어트리게 됩니다.
그래서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder 가 추가되었습니다.
StringBuilder는 StringBuffer 완전히 똑같은 기능을 가지고 있으며, 멀티쓰레드 환경이 아니라면 StringBuilder를 사용하는게 효율적입니다.
정리
위 내용들을 정리해보자면 다음과 같이 정리가 가능합니다.
- 문자열 변경이 빈번하지 않다면 String 클래스 사용.
- 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이면 StringBuffer 클래스 사용.
- 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이 아니라면StringBuilder 클래스 사용
StringBuffer
StringBuffer 선언
1. 기본 생성자 ( 기본적으로 16문자를 담을 수 있는 버퍼가 생성된다 )
StringBuffer sb = new StringBuffer();
2. StringBuffer(int length) - 지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스 생성
StringBuffer sb = new StringBuffer(10); // 10개의 문자를 담을 수 있는 버퍼를 생성
3. StringBuffer(String str) - 지정된 문자열 값을 갖는 StringBuffer 인스턴스 생성
StringBuffer sb = new StringBuffer("Hello"); // 출력 : sb = Hello
StringBuffer의 생성자와 메서드
메서드 / 설명 | 예 제 | 결 과 |
append() 매개변수로 입력된 값을 문자열로 변환하여 StringBuffer인스턴스가 저장하고 있는 문자열의 뒤에 추가한다. |
StringBuffer sb = new StringBuffer("Hello"); StringBuffer sb2 = sb.append(" world); |
( 동일한 객체내에서 문자열 변경) sb = "Hello World" sb2 = "Hello World" |
capacity() StringBuffer인스턴스의 버퍼크기를 알려준다. length() 버퍼에 담긴 문자열의 길이를 알려준다. |
StringBuffer sb = new StringBuffer(10); sb.append("ABCD"); int bufferSize = sb.capacity(); int stringSize = sb.length(); |
bufferSize = 100 stringSize = 4 (sb에 담긴 문자열이 "ABCD"이므로") |
charAt(int index) 지정된 위치(index)에 있는 문자를 반환한다. |
StringBuffer sb = new StringBuffer("Hello"); char c = sb.charAt(1); |
c = 'e' |
delete(int start, int end) 시작위치부터 끝 위치 사이에 있는 문자를 제거한다. 단, 끝 위치의 문자는 제외. |
StringBuffer sb = new StringBuffer("Hello"); sb.delete(1,4); |
sb = "Heo" |
deleteCharAt(int index) 지정된 위치(index)의 문자를 제거한다. |
StringBuffer sb = new StringBuffer("Hello"); sb.deleteCharAt(1); |
sb = "Hllo" |
insert(int pos, 매개변수) 두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos) 앞에 추가한다. pos는 0부터 시작 |
StringBuffer sb = new StringBuffer("0123456"); sb.insert(4,'ABC'); |
sb = "0123ABC456" |
replace(int start, int end, String str) 지정된 범위의 문자들을 주어진 문자열로 바꾼다. end 위치는 범위에 포함 X |
StringBuffer sb = new StringBuffer("0123456"); sb.replace(3, 6, "AB"); |
sb = "012AB6" |
reverse() StringBuffer인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열한다. |
StringBuffer sb = new StringBuffer("0123456"); sb.reverse(); |
sb = "6543210" |
setCharAt(int index, char ch) 지정된 위치의 문자를 주어진 문자(ch)로 바꾼다. |
StringBuffer sb = new StringBuffer("0123456"); sb.setCharAt(5, 'A'); |
sb = "01234A6" |
setLength(int newLength) 지정된 길이로 문자열의 길이를 변경한다. 빈 공간은 null ( '\u0000') 로 채운다. |
StringBuffer sb = new StringBuffer("0123456"); sb.setLength(5); StringBuffer sb2 = new StringBuffer("0123456"); sb2.setLength(10); String str = sb2.toString().trim(); |
sb = "01234" sb2 = "0123456 " str = "0123456" |
toString() StringBuffer인스턴스의 문자열을 String으로 변환 |
StringBuffer sb = new StringBuffer("0123456"); String str = sb.toString(); |
str = "0123456" |
substring(int start) substring(int start, int end) 지정된 범위 내의 문자열을 string으로 뽑아서 반환한다. |
StringBuffer sb = new StringBuffer("0123456"); String str = sb.substring(3); String str2 = sb.substring(3, 5); |
str = "3456" str2 = "34" |
StringBuffer의 비교
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb == sb2); // false
System.out.println(sb.equals(sb2)); // false
StringBuffer 클래스는 equals 메소드를 오버라이딩 하지 않아서 equals를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻습니다.
반면에 toString()은 오버라이딩되어 있어서 STringBuffer 인스턴스에 toString()을 호출하면, 담고 있는 문자열을 String으로 반환합니다.
그래서 StringBuffer인스턴스에 담긴 문자열을 비교하기 위해서는 toString()을 호출해서 String인스턴스를 얻은 다음, equals()를 통해 비교해야합니다.
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true
참고자료 : 자바의 정석3
'◼ JAVA' 카테고리의 다른 글
[Java/자바] 스택(Stack)과 큐(Queue) (0) | 2022.10.28 |
---|---|
[Java/자바] Math 클래스 정리 (feat.삼각함수) (0) | 2022.10.26 |
[Java/자바] String 클래스의 생성자와 메서드 (0) | 2022.10.24 |
[Java/자바] 다형성(polymorphism)이란 ? (0) | 2022.10.22 |
[Java/자바] 추상 클래스와 추상 메서드란 (abstract)? (0) | 2022.10.22 |