StringBuffer 클래스
일반적인 String클래스는 불변, 즉 변경이 불가능하고 메모리를 각각의 값에 할당해줬다면 StringBuffer 클래스는 가변, 즉 변경이 가능하다.
메모리를 할당해주면 아래의 칸에다가 계속 추가하는 방식.
sb라는 이름으로 StringBuffer의 자료형을 선언한 후 sb.append("abc")를 추가해주면 char값으로 변환 후에 재 입력받는 방식이다.
따라서 아래의 코드처럼 입력해주면 출력값은 abcHello가 된다.
StringBuffer sb = new StringBuffer("abc");
sb.append("Hello");
System.out.println(sb);
여러 문자열을 삽입하고 싶은 경우는 append를 중복하여 실행하면 코드가 간결해진다.
출력값: abc Hello Tim Nice to meet you
StringBuffer sb = new StringBuffer("abc");
sb.append(" Hello").append(" Tim").append(" Nice to meet you");
System.out.println(sb);
조심해야할 점!
String 클래스와는 다르게 equals가 오버라이딩 되어있지 않다. 즉 변수의 값이 아니라 주소값을 비교한다는 말.
따라서 아래의 코드는 두개다 false가 출력된다.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb.equals(sb2));
System.out.println(sb == sb2);
주소값이 아니라 변수의 값을 비교하여 true, false를 출력하려면 StringBuffer값을 String으로 변환 후에 비교해야 한다.
*toString()을 붙여 자료형의 값을 가져와야함!
출력값은 당연히 true이다.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2));
StringBuffer생성자
StringBuffer의 자료형을 선언할 때 관리해야할 buffer, 즉 char기본형의 개수를 지정할 수 있다.
지정을 따로 하지 않으면 16개의 문자를 관리할 수 있는 buffer를 생성해주고, 자료형의 소괄호안에 문자열을 선언한 경우 그 문자열의 개수를 제외한 16개의 문자열을 추가로 더하여 buffer를 생성해준다.
아래 예시를 참조
StringBuffer sb = new StringBuffer(10);
// 10개의 문자열을 관리하는 buffer를 생성
StringBuffer sb2 = new StringBuffer("Hello");
// 기본 16개의 문자열 + 선언된 5개의 문자열, 총 21개 문자열을 관리하는 buffer 생성
만약 관리하는 문자열 크기 이상으로 문자열이 추가되면 어떻게 될까?
컴파일러안에서 자동으로 그 배열을 복사하여 다른 메모리에 할당된 보다 큰 배열에 넣어준다.
따라서 출력은 문제없이 되지만, 쓸데없는 메모리가 소모되기 때문에 관리될 문자열의 크기를 잘 생각해서 생성할 것
StringBuffer sb = new StringBuffer(5);
System.out.println("배열의 크기 : " + sb.capacity());
sb.append("123456");
// 관리하는 문자열 이상의 개수 append!!
System.out.println("배열의 크기 : " + sb.capacity());
// 할당했던 메모리의 배열을 복사하여 다른 큰 배열의 메모리에 재할당 후 출력
StringBuffer 메서드
메서드의 종류
- capacity() : 문자열의 길이를 출력하는 것이 아닌 관리하는 총 buffer의 길이를 출력한다
- charAt() : 3이 출력된다. 다른 String클래스와 기능 동일
출력문: 3
StringBuffer sb = new StringBuffer("0123456");
System.out.println(sb.charAt(3));
- delete() : 인덱스의 길이를 설정하여 문자열 값을 지울 수 있다.
만약 인덱스의 마지막 번호, 즉 어디까지 지울지 선언하지 않으면 문자열의 끝까지 지워버린다
출력문: 01456
StringBuffer sb = new StringBuffer("0123456");
System.out.println(sb.delete(2, 4));
// 2 <= x < 4까지 지워지고 뒤의 남은 값은 빈칸으로 이동
- deletecharAt() : 문자열의 인덱스 번호를 지정하여 값을 지울 수 있다.
출력문: 013456
StringBuffer sb = new StringBuffer("0123456");
System.out.println(sb.deleteCharAt(2));
- insert() : 지정된 position에 원하는 값을 문자열로 자동변환하여 넣어준다.
할당된 문자열 자리를 한칸씩 뒤로 미루고 원하는 값을 넣는 방식.
예시에서는 2번자리를 뒤로 미루고 A를 넣었으므로 출력문은 아래와 같다
출력문: 01A23456
StringBuffer sb = new StringBuffer("0123456");
System.out.println(sb.insert(2, "A"));
- replace() : 지정된 자리를 원하는 값으로 변경하여 넣어준다 - 치환
출력문: 0123ABC6
StringBuffer sb = new StringBuffer("0123456");
System.out.println(sb.replace(4, 6, "ABC"));
// delete과 동일하게 6은 포함이 안된다.
// 4 <= x < 6
- reverse() : 관리문자열을 뒤집어서 출력한다.
출력문: 6543210
StringBuffer sb = new StringBuffer("0123456");
System.out.println(sb.reverse());
- setcharAt() : 지정된 문자열 하나를 원하는 문자열 하나로 변경한다.
출력문: 0A23456
StringBuffer sb = new StringBuffer("0123456");
sb.setCharAt(1, 'A');
System.out.println(sb);
- setLength : 선언된 buffer 크기, 즉 관리하는 배열의 길이를 변경한다
가져온 값보다 배열의 길이가 적으면 값이 온전히 출력되지 않고 설정된 길이만큼 출력된다.
출력문: 012345
StringBuffer sb = new StringBuffer("0123456");
sb.setLength(6);
// to 6까지, 즉 6이 포함되지 않는 <6이다
System.out.println(sb);
관리 배열의 길이가 더 많다면 그 자리는 'null'값으로 채워지기 때문에 .trim()으로 공백을 지워야한다.
출력문: 0123456
StringBuffer sb = new StringBuffer("0123456");
sb.setLength(10);
// 배열의 길이가 더 길다면 String값으로 변경해 trim으로 공백값을 지워준다.
String str = sb.toString().trim();
// 자료형의 값을 가져오는 toString을 쓰는 것을 잊지말 것
System.out.println(str);
- subString() : 지정된 문자열의 인덱스만큼 반환한다.
이 역시 인덱스의 마지막 번호, 즉 어디까지 반환할 지 지정하지 않으면 문자열의 끝까지 반환한다.
출력문:
34
3456
StringBuffer sb = new StringBuffer("0123456");
System.out.println(sb.substring(3,5));
System.out.println(sb.substring(3));
'Java > 자바의정석 기초편' 카테고리의 다른 글
자바의 정석 10장 (26일차) - Calendar 클래스 (0) | 2022.02.17 |
---|---|
자바의 정석 9장 (25일차) - StringBuilder & Math (0) | 2022.02.16 |
자바의 정석 9장 (25일차) - String 메서드 2 (0) | 2022.02.16 |
자바의 정석 9장 (24일차) - String 메서드 (0) | 2022.02.15 |
자바의 정석 9장 (24일차) - String 클래스 (0) | 2022.02.15 |