문자열을 저장하고 이를 다루는데필요한 메서드를 제공
한번 생성된 String인스턴스가 가지고 있는 문자열은 읽어 올 수만있고, 변경할 수는 없다.
예를 들어, '+'연산자를 이용해서 문자열을 결합할때, 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열("ab")가 담긴 String인스턴스가 생성된다.
* 문자열의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 StringBuffer클래스를 사용하는 것이 좋다.
(저장된 문자열은 변경이 가능하기 때문에)
String클래스의 생성자를 통해 객체를 생성할때는 메모리할당에 의해 항상 새로운 String인스턴스가 생성되지만,
문자열 리터럴은 이미 존재하는 것을 재사용한다.
기본형를 String으로 변환
int i = 100;
double j = 2.5;
String str1 = i +""; // "100"
String str2 = String.valueOf(j); //"2.5"
String을 기본형으로 변환
int i1 = Integer.parseInt("100");
double i2 = Double.valueOf("2.5");
System.out.println(i1); //100
System.out.println(i2); //2.5
StringBuffer클래스
내부적으로 문자열 편집을 위한 버퍼를 가지고 있으며, 인스턴스를 생성할 때 그 크기를 지정할 수 있다.
생성자로 인스턴스를 생성할때, 적절한 길이의 char형 배열이 생성되고 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다.
StringBuffer의 인스턴스로 문자열을 다루는 작업을 할 때, 버퍼의 크기가 작업하려는 문자열의 길이보다 작을 때는 내부적으로 버퍼의 크기를 증가시키는 작업이 수행된다.
(배열의 길이는 변경될수 없음으로 새로운 길이의 배열을 생성한 후에 이전 배열의 값을 복사하는 형식으로)
append()는 반환타입이 StringBuffer로 자신의 주소를 반환한다. 그래서 ab에 새로운 문자열이 추가되고, ab자신의 주소를 반환하여 ab2에는 sb의 주소인 0x100이 저장된다.
sb.append("123").append("ZZ");
위의 코드처럼 연속적으로 append()를 호출하는 것이 가능하다.
StringBuffer 생성자
public StringBuffer() {
super(16);
}
public StringBuffer(int capacity) {
super(capacity);
}
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
기본 생성자로 인스턴스를 생성하면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.
생성자의 매개변수로 int형을 받으면 지정한 문자열의 길이만큼 버퍼를 생성한다.
생성자의 매개변수로 String객체형을 받으면 지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성한다.
StringBufferr의 비교
equals()메서드를 오버라이딩 하지 않아서 해당 매서드를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과가 나온다.
toString()은 오버라이딩 되어있어서 해당 메서드를 호출하면 담고있는 문자열을 String으로 반환한다.
그래서 StringBuffer인스턴스에 담긴 문자열을 비교하기 위해서는 인스턴스에 toString()을 호출해서 String인스턴스를 얻은 다음, equals()를 사용해서 비교해야 한다.
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)) // true
StringBuilder 클래스
멀티쓰레드에 안전하도록 동기화되어있다. (동기화는 StringBuffer의 성능을 떨어뜨린다)
멀티쓰레드로 작성된 프로그램이 아닌 경우에 StringBuffer의 동기화는 불필요하게 성능만 떨어뜨리므로 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 추가되었다.
StringBuffer와 완전히 똑같은 기능으로 작성되어 있어서 StringBuffer 타입의 참조변수를 선언한 부분과 StringBuilder의 생성자만 바꾸면 된다.
항상 StringBuffer를 쓰는게 유리할까?
상황에 따라 다르다.
StringBuffer 자료형은 String 자료형보다 무거운 편에 속한다. new StringBuffer() 로 객체를 생성하는 것은 일반 String을 사용하는 것보다 메모리 사용량도 많고 속도도 느리다. 따라서 문자열 추가나 변경등의 작업이 많을 경우에는 StringBuffer를, 문자열 변경 작업이 거의 없는 경우에는 그냥 String을 사용하는 것이 좋다.
'Language > Java' 카테고리의 다른 글
8.1 Collection Framework - List 인터페이스 (0) | 2021.07.20 |
---|---|
7. 날짜, 시간 & 형식화 (0) | 2021.07.19 |
6.1 java.lang 패키지 (object 클래스) (0) | 2021.07.15 |
5. 예외처리 (0) | 2021.07.14 |
4.7 객체 지향 프로그래밍 (인터페이스) (0) | 2021.07.12 |