
🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 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 = 100stringsize = 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" |
StringBuilderStringBuffer에서 " 쓰레드(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로 바꿀 필요는 없다.