[JAVA] java.lang 패키지 [ + util classes ] (3) : StringBuffer

DongGyu Jung·2022년 2월 9일
0

자바(JAVA)

목록 보기
26/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕

*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.



StringBuffer 클래스

문자열을 저장하고 다루기 위한 클래스

  • String처럼 문자열 배열(char[])을 내부적으로 가지고 있다.
  • String달리 " 내용을 변경할 수 있다. " ( mutable )

append(String s)로 기존 문자열 배열에 추가한다.

※ 생성자

StringBuffer를 생성할 때
문자열의 길이를 고려해서 " 버퍼의 길이를 충분히 잡아주는 것이 좋다. "

/* 
<StringBuffer클래스 생성자>
기본적으로 생성할 때 
기본값을 넉넉하게 설정해놓고 

매개변수로 length가 들어오는 경우에는 
length + 기본값을 길이로 갖게끔 기본 설정해놓는 방법 
*/
public StingBuffer(int length) {
	value = new char[length] ;
    shared = false ;
}
public StringBuffer() {
	this(16) ; // 꼭 16일 필요는 없고 넉넉하게만 잡아면 된다.
}
// 문자열이 직접 입력되는 경우
public StringBuffer(String str) {
	this(str.length() + 16) ;
    append(str) ;
}

( 편집 중에 길이를 늘려주는 작업이 추가로 수행되면 작업효율이 떨어진다. )
새로운 배열 생성 - 내용복사 - 변수 참조 변경 등 등...


변경

앞서 설명했다시피
StringBuffer는 String과 달리
내용 변경이 가능하다.

※ 내용 변경 메서드

append() : 끝에 문자열 추가 메서드
delete() : 삭제 메서드
insert() : 삽입 메서드

위 메서드들은
내용 변경이 후,
즉, StringBuffer 작업 후,
스스로 자신에 대한 참조를 반환한다.

그렇기 때문에 메서드를 연속적으로 적용이 된다.

StringBuffer sb = new StringBuffer("abc");
sb.append("123").append("ZZ") ; 
/*
sb.append("123")을 수행하고 그값에 대핸 자기 자신에 대한 참조 반환해서
(.append("123")을 한 sb).append("ZZ")로 수행되는 것이다.
*/

비교

주의점
String클래스는 이미
값을 비교하게끔 equals()메서드가 오버라이딩 되어있지만

StringBuffer클래스
" equals()가 오버라이딩 되어있지 않았다. " 는 점이다.

즉,
비교를 할 때,
주소를 비교한다는 것이다.

StringBuffer sb1 = new StringBuffer("abc") ;
StringBuffer sb2 = new StringBuffer("abc") ;

System.out.println(sb1 == sb2) ; // false
System.out.println(sb1.equals(sb2)) ; // false

그렇기 때문에
StringBuffer를
" String으로 변환한 후 "
비교해야 위 코드들이 true가 된다.

String s1 = sb1.toString() ;
String s2 = sb2.toString() ;

System.out.println(s1.equals(s2)) ; // true

📋 생성자 & 메서드

✨생성

메서드 / 설명예시결과
StringBuffer()
16문자를 담을 수 있는 버퍼를 가진
StringBuffer인스턴스를 생성
StringBuffer sb = new StringBuffer() ;sb = ""
StringBuffer(int length)
지정된 개수의 문자를 담을 수 있는 버퍼를 가진
StringBuffer인스턴스를 생성
StringBuffer sb = new StringBuffer(10) ;sb = ""
StringBuffer(String str)
지정 문자열을 담은 버퍼를 가진
StringBuffer인스턴스를 생성
StringBuffer sb = new StringBuffer("Hello") ;sb = "Hello"

📐 편집

명령 실행 대상 인스턴스 값도 동일하게 적용됨

메서드 / 설명예시결과
StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(char[] str)
StringBuffer append(String str)
StringBuffer append(double d)
StringBuffer append(float f)
StringBuffer append(int i)
StringBuffer append(long l)
StringBuffer append(Object obj)
매개변수로 입력된 값을 문자열로 변환해서
StringBuffer 인스턴스 저장 문자열 에 덧붙인다.
StringBuffer sb = new StringBuffer("abc") ;
StringBuffer sb2 = sb.append(true);
sb.append('d').append(10.0f) ;
StringBuffer sb3 = sb.append("ABC").append(123) ;
sb = "abctrued10.0ABC123"
sb2 = "abctrued10.0ABC123"
sb3 = "abctrued10.0ABC123"
StringBuffer delete(int start, int end)
시작위치부터 끝위치 사이에 있는 문자 제거
중간이 삭제되면 끝에 남아있는 문자들이 채워짐.
StringBuffer sb = new StringBuffer("0123456") ;
StringBuffer sb2 = sb.delete(3,6) ;
sb = "0126"
(sb도 동일 적용)
sb2 = "0126"
StringBuffer deleteCharAt(int index)
지정된 위치 문자 제거
StringBuffer sb = new StringBuffer("0123456") ;
sb.deleteCharAt(3) ;
sb = "012456"
StringBuffer insert(int pos, boolean b)
StringBuffer insert(int pos, char c)
StringBuffer insert(int pos, char[] str)
StringBuffer insert(int pos, String str)
StringBuffer insert(int pos, double d)
StringBuffer insert(int pos, float f)
StringBuffer insert(int pos, int i)
StringBuffer insert(int pos, long l)
StringBuffer insert(int pos, Object obj)
두번째 매개변수로 받은 값을 문자열로 변환해서
★ " 지정한 위치(pos) "에 추가
StringBuffer sb = new StringBuffer("0123456") ;
sb.insert(4, '.') ;
sb = "0123.456"
StringBuffer reverse()
저장되 있는 문자열의 순서를 거꾸로 나열
StringBuffer sb = new StringBuffer("0123456");
sb.reverse();
sb = "6543210"
StringBuffer replace(int start, int end, String str)
< start~end 범위 >의 문자열을 주어진 문자열(str)로 교체
end는 포함하지 않음*
StringBuffer sb = new StringBuffer("0123456") ;
sb.replace(3, 6, "AB")
sb = "012AB6"

void setCharAt(int index, char ch)
지정위치(index) 문자를 주어진 문자(char)로 교체
StringBuffer sb = new StringBuffer("0123456");
sb.setChar(5,'o') ;
sb = "01234o6"
void setLength(int newLength)
지정된 길이(newLength)로 문자열 길이 변경
( 나머지 "빈 공간"은 null문자 [\u0000]으로 채움. / "넘치는"건 삭제)
StringBuffer sb = new StringBuffer("0123456") ;
StringBuffer sb2 = new StringBuffer("0123456") ;
sb.setLength(5);
sb2.setLength(10)
String str = sb2.toString().trim()
sb = "01234"
sb2 = "0123456 "
str = "0123456"

🚩 조회

메서드 / 설명예시결과
int capacity()
버퍼 크기 반환
(`length는 "저장된 문자열"의 길이)
StringBuffer sb = new StringBuffer(100) ;
sb.append("abcd") ;
int buffsize = sb.capacity() ;
int stringsize = sb.length();
buffsize = 100
stringsize = 4
char charAt(int index)
지정된 위치에 있는 문자 반환
StringBuffer sb = new StringBuffer("abc") ;
char c = sb.CharAt(2) ;
c = 'c'
String substring(int start)
String substring(int start, int end)
범위 내 문자열을 String으로 뽑아서 반환
- start ONLY : 《 start ~ 끝까지 》
- start & end : 《 start ~ end (end는 포함 X) 》
StringBuffer sb = new StringBuffer("0123456") ;
String str = sb.substring(3) ;
String str2 = sb.substring(3,5) ;
str = "3456"
str2 = "34"


✨ 비동기화 S.B _ StringBuilder

StringBuffer에서 " 쓰레드(Thread)의 동기화 "만 뺀 클래스
(동기화를 제외하면 StringBuffer와 완전히 똑같은 기능)

본래 StringBuffer는 멀티쓰레드(Multi - Thread)에 안전하도록
" 동기화 "되어 있다.

하지만 멀티쓰레드로 작성하지 않는다면
당연히 StringBuffer의 동기화는 불필요한 낭비이기 때문에
성능만 떨어뜨리는 상황이 발생한다.

그래서
동기화를 뺀 StringBuilder클래스가 추가된 것이다.
생성도 StringBuffer와 동일하다.

StringBuffer sb1 = new StringBuffer();
sb1.append("abc");
// sb1 = "abc"

//StringBuilder로 생성
StringBuilder sb2 = new StringBuilder();
sb2.append("abc");
// sb2 = "abc"

※ StringBuffer도 충분히 성능이 좋아서 반드시 필요한 경우가 아니면 굳이 StringBuffer로 바꿀 필요는 없다.

0개의 댓글