[Java] StringBuffer, StringBuilder 클래스와 메서드
이 게시글은 남궁성의 정석코딩 - 자바의 정석 기초편(2020최신)을 보고 공부한 내용을 정리한 게시글입니다.
틀린 내용이 있을 수 있습니다.
✔ StringBuffer 클래스
String 클래스와 달리 내용을 변경할 수 있다.
문자열가지고 조작을 많이 할 경우 StringBuffer 클래스를 사용한다.
아래와 같이 객체 타입을 StringBuffer로 지정하고 StringBuffer의 메서드인 append()로 문자를 추가하면된다.
StringBuffer s = new StringBuffer("abc");
System.out.println(s.append("def")); // abcdef
◾ StringBuffer 클래스는 equals() 메서드가 오버라이딩되어있지 않다.
String 클래스는 equals() 메서드가 내용을 비교하도록 오버라이딩 되어 있다.
// String 클래스의 equals() 메서드 사용
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str3.equals(str4)); //true
같은 코드를 StringBuffer 타입으로 변경한 후 equals() 메서드를 사용하면 false가 뜬다.
StringBuffer str3 = new StringBuffer("abc");
StringBuffer str4 = new StringBuffer("abc");
System.out.println(str3.equals(str4)); //false
StringBuffer 클래스에서 equals() 메서드를 오버라이딩한 상태로 사용하고 싶다면,
toString()을 사용해서 String 타입으로 변경한 후 비교해야 한다.
StringBuffer str3 = new StringBuffer("abc");
StringBuffer str4 = new StringBuffer("abc");
String str5 = str3.toString();
String str6 = str4.toString();
System.out.println(str5.equals(str6)); //true
✔ StringBuilder 클래스
- 싱글 쓰레드 프로그램에서 사용하기 좋다.
* 싱글 쓰레드 : 한 번에 한 개의 작업만 할 수 있다. (ex. 카톡 채팅하면서 파일 다운로드 받기 불가)
* 멀티 쓰레드 : 한 번에 여러 개의 작업을 할 수 있다. (ex. 카톡 채팅하면서 파일 다운로드 받기 가능)
StringBuilder를 사용하는 이유
멀티 쓰레드 프로그램에서는 데이터를 공유하고 있어 작업하는 도중에 다른 사람이 건드릴 수 있다.
그래서 데이터를 보호하기 위해 동기화되어 있는 StringBuffer 클래스를 사용한다.
이 동기화는 멀티 쓰레드 프로그램이 아닌 경우 불필요한 작업을 진행해 성능 저하를 가져오기 때문에,
싱글쓰레드 프로그램을 사용하는 경우 동기화되어 있지 않은 StringBuilder 클래스를 사용한다.
결론
멀티 쓰레드 프로그램이다 ⇒ StringBuffer 클래스
싱글 쓰레드 프로그램이다 ⇒ StringBuilder 클래스
✔ StringBuffer 메서드
StringBuilder 클래스도 사용할 수 있다.
◾ StringBuffer()
16문자를 담을 수 있는 버퍼(메모리 영역)를 가진 StringBuffer 객체를 생성한다.
괄호에 아무것도 입력하지 않을 경우 길이가 16인 배열이 생성되고,
숫자를 넣을 경우 숫자만큼의 문자를 담을 수 있는 배열을 생성,
문자를 넣을 경우 문자 개수 + 16 길이의 배열을 생성한다.
StringBuffer sb = new StringBuffer(); // 길이가 16인 배열
StringBuffer sb2 = new StringBuffer(10); // 길이가 10인 배열
StringBuffer sb = new StringBuffer("Hi"); // 길이가 18인 배열
◾ StringBuffer append(), StringBuffer insert(int pos, type)
StringBuffer append()
매개변수로 입력된 값을 문자로 변환하여 StringBuffe 객체가 저장하고 있는 문자열의 뒤에 덧붙인다.
StringBuffer sb1 = new StringBuffer("abc");
System.out.println(sb1); //abc
StringBuffer sb2 = sb1.append(true);
System.out.println(sb2); //abctrue
StringBuffer sb3 = sb1.append(123);
System.out.println(sb3); //abctrue123
System.out.println(sb1); //abctrue123
System.out.println(sb2); //abctrue123
System.out.println(sb3); //abctrue123
append는 기존 문자열 뒤에 값을 덧붙이고, 변수들은 그 주소를 참조하고 있기 때문에
변수의 이름은 달라져도 참조하고 있는 주소가 같아 결과가 동일한 것을 확인할 수 있다.
StringBuffer insert(int pos, type)
type에 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다.
append()는 무조건 뒤에 삽입하는 반면, insert()는 원하는 위치에 추가할 수 있다.
StringBuffer sb = new StringBuffer("abcde");
sb.insert(3,"ccc");
System.out.println(sb); //abccccde
◾ int capacity(), int length(), void setLength()
int capacity()
StringBuffer 객체의 버퍼크기를 알려준다.
int length()
StringBuffer 객체의 버퍼에 담긴 문자열의 길이를 알려준다.
StringBuffer sb = new StringBuffer();
sb.append("123");
System.out.println(sb.capacity()); //16
System.out.println(sb.length()); //3
sb.append("abcd");
System.out.println(sb.capacity()); //16
System.out.println(sb.length()); //7
- 처음 생성할 때 버퍼크기를 정해주지 않았으므로 capacity()의 값은 16이 나온다.
- length()는 버퍼에 담긴 문자열의 길이를 알려주므로 123의 길이, 3이라는 값이 나온다.
- append로 문자열을 추가한 후 capacity()를 구하면, 16이 나온다. 문자열이 추가된 것이기 때문이다.
- length()를 구하면 123abcd의 길이, 7이라는 값이 나온다.
void setLength(int newLength)
newLength에 입력한 길이로 문자열의 길이를 변경한다.
길이만큼의 문자열이 없을 경우 널문자 '\u0000'으로 채운다.
StringBuffer sb = new StringBuffer();
sb.append(123456789);
System.out.println(sb.length()); //9
sb.setLength(5);
System.out.println(sb); //9
sb.setLength(15);
System.out.println(sb); //12345 , 문자열 뒤에 10만큼의 공백이 있다.
◾ char charAt(int index)
지정된 위치(index)에 있는 문자를 반환한다.
StringBuffer sb = new StringBuffer("abcde");
System.out.println(sb.charAt(3)); //d
◾ StringBuffer delete(), StringBuffer deleteCharAt()
StringBuffer delete(int start, int end)
start 위치부터 end-1 위치까지의 문자를 제거한다.
StringBuffer sb = new StringBuffer("abcde");
System.out.println(sb.delete(1,3)); //ade
StringBuffer deleteCharAt(int index)
index 위치에 있는 문자를 제거한다.
StringBuffer sb = new StringBuffer("abcde");
System.out.println(sb.deleteCharAt(3)); //abce
◾ StringBuffer replace(), void setCharAt()
StringBuffer replace(int start, int end, String str)
start에서 end-1 사이의 글자를 str로 치환한다.
StringBuffer sb = new StringBuffer("abcde");
sb.replace(2, 4, "**");
System.out.println(sb); //ab**e
void setCharAt(int index, char ch)
index 위치에 있는 문자를 ch문자로 변경한다.
StringBuffer sb = new StringBuffer("abcde");
sb.setCharAt(4,'2');
System.out.println(sb); //abcd2
◾ StringBuffer reverse()
객체에 저장되어 있는 문자열의 순서를 거꾸로 나열한다
StringBuffer sb = new StringBuffer("abcde");
System.out.println(sb.reverse()); //edcba
◾ String substring()
String substring(int start)
start 범위부터 끝까지의 문자열을 잘라서 반환한다.
반환타입은 String이다.
String substring(int start, int end)
start 범위부터 end-1까지의 문자열을 잘라서 반환한다.
반환타입은 String이다.
StringBuffer sb = new StringBuffer("123456789");
System.out.println(sb.substring(5)); //6789
System.out.println(sb.substring(5,7)); //67