자바의 정석 9장 (25일차) - StringBuffer 생성자 & 메서드

728x90

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));
728x90