자바/java.lang 패키지

java.lang패키지(5) - StringBuffer 클래스와 StringBuilder 클래스

백_곰 2021. 12. 26. 18:10

1. StringBuffer 클래스

- String 클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만, StringBuffer 클래스는 변경이 가능하다.

 

- 내부적으로 문자열을 편집을 위한 공간(buffer)이 있으며, 인스턴스 생성 시, 그 크기를 지정할 수 있다.

 

- 이때, 크기는 충분히 잡는 것이 좋다.

 

- StringBuffer(int length) 생성자를 통해 크기를 지정하는데, 만약 무시한다면, 16개의 문자를 저장할 수 있는

크기의 버퍼를 생성한다.

 

 

- 아래의 코드는 StringBuffer에 대한 클래스 생성자 구조이다.

public final class StringBuffer implements java.io.Serializable{
	private char[] value;
	
	public StringBuffer(int length) {
		value = new char[length];
		//shared = false;
	}
	
	public StringBuffer() {
		this(16);
	}
	
	public StringBuffer(String str) {
		this(str.length()+16);
		//append(str);
	}
}

( 이때, 문자열이 length의 크기를 넘어선다면, 내부적으로 버퍼의 크기를 늘리는 작업을 한다. )

( 배열의 length는 변경할 수 없으므로, 복사를 통해서 이루어진다. )

 

 

 

 

1-1. StringBuffer 클래스의 변경

- append() 메서드는 반환타입이 StringBuffer인데 자신의 주소를 반환한다.

 

- 아래의 코드를 보고 이해하자.

 

( 자신의 주소를 반환하므로 sb1을 복사하여 sb2에 저장되었다. )

 

 

 

 

1-2. StringBuffer의 비교

- String 클래스는 equals() 메서드를 오버라이딩 했기 때문에, 등가비교연산자(==)과는 같지 않다.

 

 

- 그러나, StringBuffer 클래스는 equals() 메서드를 오버라이딩 하지 않았기 때문에 등가비교연산자(==)와 같다.

 

 

- 그래서 StringBuffer 클래스의 객체의 문자열 비교는 toSting()을 통해서 해야한다.

 

 

 

 

1-3. StringBuffer 클래스의 생성자와 메서드들

- 중요하다고 생각되는 부분만 꼽았다.

 

(1) StringBuffer append(모든 자료형과 참조형)

 

 

(2) int capacity()

 

 

(3) StringBuffer delete(int start, int end)

 

 

(4) StringBuffer deleteCharAt(int index)

( 지정된 index 위치에 있는 것을 삭제한다. )

 

 

(5) StringBuffer insert(int pos, 모든 자료형과 참조형)

 

 

(6) StringBuffer replace(int start, int end, String str)

 

 

(7) void setCharAt(int index, char ch)

 

 

(8) void setLength(int newLength)

 

 

(9) String substring(int start) + String substring(int start, int end)

 

 

(10) StringBuffer reverse()

- 문자열의 순서를 거꾸로 바꿔준다.

 

 

 

 

2. StringBuilder 클래스

- StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있다. 그러나 동기화는 StringBuffer의 성능을

떨어뜨린다.

 

- 만약 멀티쓰레드가 아닌 프로그램이라면, 동기화는 불필요하게 성능만 떨어뜨린다.

 

- 그래서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었다.

 

- StringBuilder는 StringBuffer와 완전히 똑같은 기능으로 작성되어 있어서, 소스 코드에서 StringBuffer 대신

StringBuilder만 바꾸기만 하면 된다.

 

- 단, 성능을 우선시 한다면, 둘 중 어느 것이 나은지 판단해본다.

 

 

 

 

다음장

java.lang패키지(6) - Math 클래스 (tistory.com)

 

java.lang패키지(6) - Math 클래스

1. Math 클래스 - 기본적으로 Math 클래스는 생성자가 private으로 되어 있기 때문에 만들 수 없다. 왜냐하면 인스턴스 변수가 없고 모두 다 static으로 되어 있기 때문이다. - 상수로는 다음과 같다. (1)

kind-coding.tistory.com