공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
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 문자열을 만드는데 편리하게 사용할 수 있다.
'Back end > Java' 카테고리의 다른 글
[Java] java.lang 패키지 - 래퍼 클래스 (Wrapper Class) (0) | 2019.07.16 |
---|---|
[Java] java.lang 패키지 - Math 클래스 (0) | 2019.07.15 |
[Java] java.lang 패키지 - String클래스 (0) | 2019.07.12 |
[Java] java.lang 패키지 - Object클래스 (0) | 2019.07.12 |
[Java] 예외처리(Exception Handling) (0) | 2019.07.11 |