변경 불가능한(immutable) 클래스
한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 오기만 가능하고, 변경할 수 없다.
String a = "a";
String b = "b";
a = a + b;
Plain Text
복사
위와 같은 경우 참조변수 a가 참조하고 있는 인스턴스의 값이 a
ab로 바뀌는 것이 아니라 새로운 문자열(ab)이 담긴 String인스턴스가 생성되고 참조변수a가 새로 생성된 인스턴스를 참조하게 된다.
이처럼 덧셈연산자(+)를 사용해서 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String인스턴스가 생성되어 메모리공간을 차지하게 된다.
문자열 간의 결합이나 추출 등 문자열을 다루는 작업을 많이 하는 경우에는 String클래스 대신 StringBuffer클래스 를 사용하는 것이 좋다.
StringBuffer인스턴스에 저장된 문자열은 변경이 가능하기 때문이다.
StringBuffer클래스
내부적으로 문자열 편집을 위한 buffer를 가지고 있으며, 생성할 때 buffer의 크기를 지정할 수 있다.
•
문자열이 버퍼의 길이를 넘어서게 되면 버퍼의 길이를 늘려주는 작업이 추가로 필요하게 되는데, 이렇게 되면 효율이 떨어지므로 편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다.
•
버퍼의 길이를 늘려주는 작업
1.
더 길이가 긴 버퍼를 생성
2.
기존 버퍼의 문자열을 복사, 붙여넣기
3.
새로운 버퍼의 주소값을 기존 참조변수에 대입
StringBuffer의 변경
StringBuffer sb = new StringBuffer("a");
sb.append("b");
Plain Text
복사
StringBuffer의 비교
•
StringBuffer클래스에는 equals()는 오버라이딩 되어 있지 않이만 toString()은 오버라이딩 되어 있다.
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
boolean result = sb1.toString().equals(sb2.toString());
System.out.println("result = " + result);
//결과 : result = true
Plain Text
복사
StringBuffer의 생성자와 메서드
•
String클래스와 유사한 메서드를 많이 가지고 있다.
•
추가, 변경, 삭제와 같이 저장된 내용을 변경할 수 있는 메서드들이 추가로 제공
생성자
StringBuffer()
•
16문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스 생성
StringBuffer sb = new StringBuffer();
System.out.println(sb.capacity());
//결과 : 16
Plain Text
복사
StringBuffer(int length)
•
length 만큼 담을 수 있는 버퍼를 가진 인스턴스 생성
StringBuffer sb = new StringBuffer(20);
System.out.println(sb.capacity());
//결과 : 20
Plain Text
복사
StringBuffer(String str)
•
지정된 문자열 값을 갖는 인스턴스 생성
•
지정한 문자열의 길이보다 16 더 크게 버퍼를 생성
StringBuffer sb = new StringBuffer("hi");
System.out.println(sb.capacity());
//결과 : 18
Plain Text
복사
메서드
append() - 추가
•
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer인스턴스가 저장하고 있는 문자열의 뒤에 덧붙인다.
StringBuffer sb = new StringBuffer("0123456");
sb.append(true);
// sb = "0123456true"
Plain Text
복사
delete(int start, int end) - 삭제
•
start부터 end 사이에 있는 문자를 제거한다.
•
단, 끝 위치의 문자는 제외
StringBuffer sb = new StringBuffer("0123456");
sb.delete(3, 6);
// sb = "0126"
Plain Text
복사
deleteCharAt(int index) - 삭제
•
index 위치의 문자를 제거한다.
StringBuffer sb = new StringBuffer("0123456");
sb.deleteCharAt(3);
// sb = "012456"
Plain Text
복사
insert(int pos, 문자열) - 삽입
•
두 번째 매개변수로 받은 값을 문자열로 변환하여 pos 위치에 추가한다.
StringBuffer sb = new StringBuffer("0123456");
sb.insert(3, "hi");
// sb = "012hi3456"
Plain Text
복사
replace(int start, int end, String str) - 변경
StringBuffer sb = new StringBuffer("0123456");
sb.replace(0, 7, "hi");
// sb = "hi"
Plain Text
복사
capacity()
•
버퍼의 크기를 알려준다.
StringBuffer sb = new StringBuffer("0123456");
System.out.println(sb.capacity());
// 23
Plain Text
복사
length()
•
버퍼에 담긴 문자열의 길이를 알려준다.
StringBuffer sb = new StringBuffer("0123456");
System.out.println(sb.length());
// 7
Plain Text
복사
StringBuilder클래스
•
StringBuilder는 동기화만 뺀 StringBuffer와 완전히 똑같은 기능으로 작성되어있다.
•
멀티 쓰레드 프로그램
StringBuffer
•
싱글 쓰레드 프로그램
StringBuilder
동기화(멀티 쓰레드에 안전) | |
StringBuilder | |
StringBuffer |