[Java] String / StringBuffer / StringBuilder 비교
StringBuffer / StringBuilder 클래스
StringBuffer, StringBuilder 클래스는 문자열을 연산(추가하거나 변경) 할 때 주로 사용하는 자료형이다.
String 자료형 만으로도, + 연산이나 concat() 메소드로 문자열 연산을 할 수 있지만, 새로운 객체를 생성하게 되므로 메모리 낭비, 속도 저하 등의 단점이 있다.
-> StringBuffer, StringBuilder 클래스는 버퍼(Buffer) 라는 독립적인 공간에 문자열을 저장, 추가 하여 공간의 낭비도 적으며 속도도 빠르다.
String vs (StringBuffer, StringBuilder) 비교
String은 불변
아래 코드를 보면 변수가 참조하는 "Hello" 라는 문자열에 + 연산을 통해 string 객체의 값을 업데이트 시킨 것을 볼 수 있다. 하지만 실제로는, 메모리에 새로 "Hello world" 값을 저장한 영역을 따로 만들고 변수를 다시 참조하는 식으로 작동한다.
String str = "Hello";
str += "world!";
System.out.println(str);

StringBuffer, StringBuilder 는 가변
위와 같은 코드 예제에서 StringBuffer의 경우 가변성을 가지기 때문에 동일 객체 내에서 문자열의 크기를 변경하는 것이 가능하다.

equals() 로 비교 불가
String 객체는 equals() 메소드로 동일한 값인지 비교가 가능하다.
그러나, StringBuffer / StringBuilder equals() 메소드를 오버라이딩 하지 않기 때문에 '==' 로 비교한 것과 같은 값이 나온다.
따라서 toString() 으로 String객체로 변환한 뒤 equals() 메소드를 사용해 동일 값 비교를 시행한다.
StringBuilder 메소드
| append(값) | 문자열 추가 |
| delete(시작, 끝) | 시작 인덱스부터 끝 인덱스까지의 내용을 삭제 |
| insert(위치, 값) | 특정 위치에 문자열을 추가 |
| replace(시작, 끝, 값) | 시작 인덱스부터 끝 인덱스 이전까지의 내용을 추가하고자 하는 값으로 문자열을 대체 |
| reverse() | 저장한 문자열의 값을 뒤집음 |
| substring(시작, 끝) | 저장된 문자열 중 시작부터 끝 이전까지의 내용만 담은 String 인스턴스 반환 |
| deleteCharAt(위치) | 특정 위치 값 삭제 |