공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

 

 

StringBuffer클래스

  인스턴스를 생성할 때 지정된 문자열을 변경할 수 없는  String 클래스와 달리  StringBuffer 클래스는 변경이 가능하다. 내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며,  StringBuffer 인스턴스를 생성할 때 크기를 지정할 수 있다. 버퍼의 크기는 변경할 수 있지만 편집 중인 문자열이 버퍼의 길이를 넘어가면 버퍼의 길이를 늘려주는 작업을 추가로 해줘야 해서 효율이 떨어지므로 넉넉하게 잡는 것이 좋다.

 

 

public final class StringBuffer implements java.io.Serializable{
	private char[] value;
    ...
}

 StringBuffer 클래스도  String 클래스처럼 문자열을 저장하기 위한  char 형 배열의 참조 변수가 인스턴스 변수로 선언되어있다.  StringBuffer 인스턴스가 생성될 때,  char 형 배열이 생성되며 이때 생성된  char 형 배열을 인스턴스 변수  value 가 참조하게 된다. 

 

 

 

 

StringBuffer의 생성자

생성자의 종류 설  명
public StringBuffer(int length)  length 길이를 가진  StringBuffer 클래스의 인스턴스(buffer)를 생성한다.
public StringBuffer( ) 버퍼의 길이를 지정하지 않으면 크기가  16 인 버퍼를 생성한다.
public StringBuffer(String str) 지정한 문자열( str )의 길이보다  16 만큼 더 큰 버퍼를 생성한다.

 StringBuffer 클래스의 인스턴스를 생성하면 지정한 길이의  char 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다. 인스턴스를 생성할 때 생성자  StringBuffer(int length) 를 사용해서 만드는데, 저장될 문자열의 길이를 고려하여 충분한 길이를 지정해주면 된다. 크기를 지정하지 않으면  16 개의 문자를 저장할 수 있는 버퍼를 생성한다. 

 

 

 

 

StringBuffer의 길이 변경

...
    //새로운 길이 (newCapacity)의 배열을 생성
    char newValue[] = new char[newCapacity];
    
    //배열 value의 내용을 배열 newValue로 복사
    System.arraycopy(value, 0, newValue, 0, count);	//count는 문자열의 길이
    value = newValue;	//새로 생성된 배열(newValue)의 주소를 value에 저장

 StringBuffer 클래스의 코드를 확인해보면 인스턴스로 문자열을 다루는 작업을 할 때, 버퍼의 크기가 모자라면 내부적으로 버퍼의 크기를 증가시키는 작업이 수행되는 것을 알 수 있다.  (배열의 길이는 변경할 수 없으므로 새로운 길이의 배열을 생성한 후에 이전 배열의 값을 복사한다.) 위의 과정이 끝나면 길이가 증가된 새로운 배열을 참조하게 된다. 

 

 

package Test;

public class Test {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer(5);
		
		sb.append("abcde");	//append()를 사용하면 버퍼에 문자열을 추가할 수 있다.
		System.out.println(sb);
		System.out.println("capacity : " + sb.capacity());	//capacity()를 사용하면 버퍼의 크기를 확인할 수 있다.
		
		System.out.println();
		
		sb.append("fghij");
		System.out.println(sb);
		System.out.println("capacity : " + sb.capacity());
		
	}
}

 

실행결과

별도의 작업을 하지 않아도 내부적으로 길이가 변경된 것을 확인할 수 있다.

 

 

 

 

StringBuffer의 변경

 String 과 달리  StringBuffer 는 내용을 변경할 수 있다.

 

package Test;

public class Test {
	public static void main(String[] args) {	
		
		StringBuffer sb = new StringBuffer("abc");	//abc가 들어있는 StringBuffer의 인스턴스 sb를 생성
		System.out.println(sb);
		
		sb.append("123");	//sb에 "123"을 추가 -> 내부적으로 길이가 늘어나고 123이 추가된 abc123이 저장됨
		System.out.println("sb.append() 사용후 : " + sb);
		
		System.out.println();
		
		StringBuffer sb2 = sb.append("DEF");	// sb에 DEF를 추가한 뒤(abc123DEF), 새로 생성한 StringBuffer타입의 참조변수 sb2가 sb를 가리키도록 함
		System.out.println("== sb2 생성 후 ==");
		System.out.println(sb);
		System.out.println(sb2);
		
	}
}

 

실행결과

 sb 와  sb2 가 같은  SttringBuffer 의 인스턴스를 가리키고 있어서 같은 결과가 출력되는 것을 확인할 수 있다. 추가로   append( ) 는 반환 타입이  StringBuffer 인 자신의 주소를 반환한다. 그래서 하나의 인스턴스에 대해서  sb.append("123").append("zz") 처럼  append( ) 를 연속으로 쓸 수도 있다. 

 

 

 

 

StringBuffer의 비교

   String 클래스의  equals 메서드는 문자의 내용을 비교하도록 오버라이딩되어 있었지만  StringBuffer 클래스는  equals 메서드가 오버라이딩되어있지 않아서  == 연산자와 마찬가지로 주소 값을 비교한다. 

  반면에  toString( ) 은 오버라이딩 되어있어서  StringBuffer 인스턴스에  toString( ) 을 호출하면, 저장되어있는 문자열을  String 으로 반환한다. 그래서  StringBuffer 인스턴스의 문자열들을 비교하려면  toString( ) 을 호출해서  String 인스턴스를 얻은 다음 이들을  equals ( String 클래스의  equals 메서드)를 이용해서 비교해야 한다. 

package Test;

public class Test {
	public static void main(String[] args) {	
		
		StringBuffer sb1 = new StringBuffer("abc");
		StringBuffer sb2 = new StringBuffer("abc");
		
		System.out.println("sb1 == sb2 : " + (sb1 == sb2));
		System.out.println("sb1.equals(sb2) : " + sb1.equals(sb2));
		
		System.out.println();
		
		//String타입의 값들로 값을 비교하기 위해서 toString()을 이용한다.
		String s1 = sb1.toString();
		String s2 = sb2.toString();
		
		System.out.println("==toString()으로 변환해서 비교한 결과==");
		System.out.println("s1 == s2 : " + (s1 == s2));	//주소비교라서 false
		System.out.println("s1.equals(s2) : " + s1.equals(s2));
		
	}
}

 

실행결과

 StringBuffer 클래스의 인스턴스들을  String 타입으로 변환하지 않고 비교하면  == 연산자를 사용한 결과와  equals 메서드를 사용한 결과가 같은 것을 확인할 수 있다. 반면에  toString( ) 을 사용해서  String 클래스의 인스턴스로 만들어서 비교하면  equals 를 사용했을 때 내용 비교가 되는 것을 확인할 수 있다.( == 는 주소 값 비교라서 변환해도 안됨)

 

 

 

 

StringBuffer클래스의 생성자와 메서드

메서드 설  명
StringBuffer( ) 버퍼의 길이를 지정하지 않으면 크기가  16 인 버퍼를 생성
StringBuffer(int length)  length 길이를 가진  StringBuffer 클래스의 인스턴스(buffer)를 생성
StringBuffer(String str) 지정한 문자열( str )의 길이보다  16 만큼 더 큰 버퍼를 생성
StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(char[ ] str)
StringBuffer append(double d)
StringBuffer append(float f)
StringBuffer append(int i)
StringBuffer append(long l)
StringBuffer append(Object obj)
StringBuffer append(String str)
매개변수로 입력된 값을 문자열로 변환하여  StringBuffer 인스턴스가 저장하고 있는 문자열의 뒤에 덧붙임
int capacity( )  StringBuffer 인스턴스의 버퍼크기 반환
int length( )  StringBuffer 인스턴스에 저장된 문자열의 길이 반환
char charAt(int index) 지정된 위치( index )에 있는 문자를 반환
StringBuffer delete(int start, int end) 시작위치( start )부터 끝 위치( end )사이에 있는 문자를 제거
단,  end 위치의 문자는 제외(start <= x < end)
StringBuffer deleteCharAt(int index) 지정된 위치( index )의 문자를 제거
StringBuffer insert(int pos, boolean b)
StringBuffer insert(int pos, char c)
StringBuffer insert(int pos, char[ ] str)
StringBuffer insert(int pos, doule 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)

StringBuffer insert(int pos, String str)
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치( pos )에 추가
( pos 는 0부터 시작)
StringBuffer replace(int start, int end, String str) 지정된 범위( start  ~  end )의 문자들을 주어진 문자열로 바꾼다.
단,  end 의 위치는 범위에 포함되지 X (start <= x < end)
StringBuffer reverse( )  StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열
void setCharAt(int index, char ch) 지정된 위치( index )의 문자를 주어진 문자( ch )로 바꾼다.
void setLength(int newLength) 지정된 길이로 문자열의 길이를 변경
길이를 늘리는 경우에는 나머지 빈공간들을 널문자( \u0000 )로 채운다.
String toString( )  StringBuffer 인스턴스의 문자열을  String 으로 변환
String substring(int start)
String substring(int start, int end)
지정된 범위 내의 문자열을  String 으로 뽑아서 반환
(시작위치( start )만 지정하면 시작위치부터 끝까지 뽑아서 반환)

 

 

 

StringBuilder

   StringBuffer 는 멀티쓰레드에 안전(thread safe)하도록 동기화되어있다. 멀티쓰레드로 작성된 프로그램이 아닌 경우,  StringBuffer 의 동기화는 불필요하게 성능만 떨어뜨린다. 그래서  StringBuffer 에서 쓰레드의 동기화만 뺀  StringBuilder 가 나왔다.  StringBuilder 는  StringBuffer 와 똑같은 기능으로 작성되어 있어서  StringBuffer 를  StringBuilder 로 바꿀 경우 참조 변수를 선언한 부분과  StringBuffer 의 생성자만 바꾸면 된다. 성능 향상이 반드시 필요한 경우를 제외하고는 굳이 변환할 필요가 없다. 

 

 

 

text block (Java 13이후)

String html =  """
                <html>
                    <body>
                    </body>
                </html>""";

문자열을 """ 사이에 이어서 만들 수 있다. html, json 문자열을 만드는데 편리하게 사용할 수 있다.

 

 

+ Recent posts