StringBuilder, StringBuffer 클래스
- 내부적으로 가변적인 char[ ]를 멤버변수로 가짐
- 문자열을 여러번텍스트 연결하거나 변경할때 사용함
- 새로운 인스턴스를 생성하지 않고 char[ ]을 변경함
- StringBuilder : 단일 쓰레드에서 사용
- StringBuffer : 멀티 쓰레드에서 사용 - 동기화
- append()을 이용하여 StringBuilder에 문자열 추가
String, StringBuilder로 문자열을 붙이는 예제이다.
StringBuilder sb = new StringBuilder();
String str1 = "Hello";
String str2 = "World!!";
//StringBuilder 이용
sb.append(str1).append(" ").append(str2); //sb.append(str1+" "+str2)와 같다.
System.out.println(sb); //Hello World!!
// + 더하기 연산 사용
String str = str1 + str2;
System.out.println(str); //HelloWorld!!
// concat() 사용
str1 = str1.concat(str2);
System.out.println(str1); //HelloWorld!!
1. String
1) String과 StringBuffer, StringBuilder의 차이점
String
과 StringBuffer
, StringBuilder
와의 차이점은 변함에 있다.
String은 불변이고, 나머지 두개는 변할 수 있다는 점이 차이점이다.
String객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다.
2)데이터 추가
String은 + 또는 concat을 이용해 두개의 String을 붙일 수 있다. 이 경우 말그대로 하나의 String에 다른 하나를 붙이는 것이 아닌, 새로운 String 객체를 만들어 새로운 문자열을 저장한다. 즉, String 클래스 객체는 Heap 영역에 생성되어 한번 생성된 객체를 변경할 수 없고, 기존 객체가 제거되면 gc가 동작하기 전까지 남아있다.
따라서 String 객체는 문자열 연산이 많은 경우, 성능이 좋지않고 메모리 낭비가 크다.
그래서 StringBuilder, StringBuffer을 사용하는 것이 좋다.
2. StringBuffer, StringBuilder
이 클래스들은 String과 다르게 유연하게 동작할 수 있다. 문자열이 추가됨에 따라 기존 객체의 공간이 부족할 경우, 기존의 크기를 늘리며 유연하게 동작한다.
이 두 클래스의 차이점은 synchronized 여부 이다. StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서의 동기화를 지원한다. 이와 달리 StringBuilder는 그렇지 않다. 그래도 동기화 관련 문제로 StringBuffer는 StringBuilder에 비해 성능이 조금 좋지 않다. 따라서 동기화 문제가 전혀 없는 경우에는 StringBuilder를 사용하는 것이 좋다.
3. Methods
StringBuilder, StringBuffer에서 사용하는 메소드들은 동일하다.
append()
- 문자열을 이어붙인다.
toString()
- StringBuilder 객체는 String이 아니다.
따라서 toString을 사용해서 String으로 변환해야한다.
(System.out.println(sb)는 그대로 출력된다.)
reverse()
- 문자열을 뒤집어준다. ( "hello" -> "olleh" )
setLength(0)
- StringBuilder, StringBuffer 초기화
insert(int index, String str)
- 주어진 index에 str을 끼워넣는다.
setCharAt(int index, char ch);
- 주어진 index를 ch로 변경한다.
deleteCharAt(int index)
- 해당 인덱스의 문자를 삭제한다.
replace(int index1, int index2, String str)
- index1부터 index2 한칸 앞까지를 str로 변경한다.
delete(int index1, int index2)
- index1부터 index2 한칸 앞까지를 삭제한다.
이외에 String에서 사용하는 메소드도 사용 가능하다.
'JAVA & Spring' 카테고리의 다른 글
[Java] 소켓 프로그래밍(Socket Programming) 예제 / ServerSocket, Socket, Thread 프로그래밍 (0) | 2024.08.09 |
---|---|
[Java] Scanner, BufferedReader, BufferedWriter (0) | 2023.06.26 |
[JAVA] Comparator / Comparable - 정렬을 위한 클래스(인터페이스) (2) | 2023.06.10 |
[JAVA] 배열의 길이 length에는 괄호()가 붙지 않고, 문자열의 길이 length()에는 괄호()가 붙는 이유 (0) | 2023.06.03 |
[JAVA] Math 클래스 (0) | 2023.06.02 |