문자열을 저장하는 String은 내부의 문자열을 수정할 수 없다.(내용 변경 불가) 또한 문자열을 결합하는 +연산자를 많이 사용할수록 성능을 느리게 한다.
→문자열을 변경하는 작업이 많을 경우에는 StringBuffer 또는 StringBuilder 클래스를 사용하는 것이 좋다!
- StringBuffer 클래스
- String처럼 문자형배열(char[])을 내부적으로 갖고있다. 그러나, String과 달리 내용을 변경할 수 있다.
- 배열은 길이 변경 불가. 공간이 부족할땐? 3단계 처리 필요
- 새로운 배열 생성
- 내용복사
- 참조(주소) 변경
→ StringBuffer는 저장한 문자열의 길이를 고려해서 적절한 크기로 생성해야 한다.
- StringBuffer는 equals()가 오버라이딩되어있지않다. (내용이 아닌, 주소를 비교)
- StringBuffer를 비교하려면, String으로 변환 후에(sb.toString()) equals()로 비교
- StringBuilder 클래스의 메소드
메소드 | 설명 |
append() | 문자열 끝에 주어진 매개값을 추가 |
insert(int offset, ...) | 문자열 중간에 주어진 매개값을 추가 |
delete(int start, int end) | 문자열의 일부분을 삭제 |
deleteCharAt(int index) | 주어진 index의 문자(1개)를 삭제 |
replace(int start, int end, String str) | 문자열의 일부분을 다른 문자열로 변환 |
reverse() | 문자열의 순서를 뒤바꿈 (문자열 뒤집기) |
serCharAt(int index, char ch) | 주어진 index의 문자를 다른 문자로 변환 |
- append()는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환
- sb.append("123").append("ab");
StringBuilder sb=new StringBuilder(); //StringBuilder 객체 생성
//끝에 문자열 추가
sb.append("java");
sb.append("coding study");
System.out.println(sb.toString()); //java coding study
//index 4에 "8" 삽입
sb.insert(4, "8"); //java8 coding study
//index 6부터 11까지 "book"문자열로 대치
sb.replace(6, 12, "book"); //java8 book study
//index 4 삭제
sb.deleteCharAt(4); //java book study
//index 5부터 8까지 삭제
sb.delete(5,9) //java study
int length=sb.length(); //총 문자수 length는 10
- StringBuilder 클래스가 제공하는 생성자
- 기본 생성자인 StringBuilder()는 16개의 문자들을 저장할수있는 버퍼를 만든다.
- StringBuilder(int capacity) 생성자는 주어진 개수만큼 문자들을 저장할 수 있는 버퍼를 만든다.
- StringBuilder(String str) 생성자는 str로 주어진 매개값을 버퍼의 초기값으로 저장한다.
StringBuilder sb=new StringBuilder();
StringBuilder sb=new StringBuilder(16);
StringBuilder sb=new StringBuilder("java");
- StringBuffer 또는 StringBuilder 의 사용방법은 동일한데, 차이점은 StringBuffer는 멀티쓰레드환경에서 사용할 수 있도록 동기화가 적용되어있어 멀티쓰레드에 안전하지만, StringBuilder는 싱글쓰레드환경에서만 사용하도록 설계되어있다.
- 멀티스레드프로그램이 아닌 경우에 동기화는 불필요한 성능 저하 →StringBuffer 대신 StringBuilder를 사용하면 성능 향상
728x90
반응형
'Java Tutorial' 카테고리의 다른 글
[Java] 인터페이스 (interface) (0) | 2024.06.16 |
---|---|
[Java 필수 지식] 접근제어자 (0) | 2024.06.08 |
[Java] 예외 처리 (0) | 2023.07.02 |
[Java 필수 기초 지식] 클래스 (생성자, 필드, 메소드) (0) | 2023.06.06 |
[Java] 람다식 (0) | 2023.03.14 |