주로 Java를 공부할 때 String 객체를 많이 사용하게 된다.
하지만, String객체는 설계부터가 불변 객체로 설계되었기 때문에 한번 생성이 되면 내용을 바꿀 수 없는 단점이 있다. (물론 자바에서는 바꾸게 해 주지만,)
예를 들어서
String test = "test";
라는 코딩을 했다고 가정하자, test라는 문자열 인스턴스를 메모리에 생성하게 된다.
test라는 레퍼런스는 "test"라는 값을 가지고 있고, 단지 test는 "test"라는 문자열을 가리키는 레퍼런스가 된다.
(C 포인터 개념으로 생각하면 됨.)
하지만, 우리는 코딩할 때 다음과 같이 문자열을 늘리거나 추가를 한다.
test += "테스트";
그럼 출력 결과는 원하는 대로 나오는가?
정답은 yes다
출력 결과를 본다면 다음과 같다.
"test테스트"
그럼 어떻게 돌아가는 것일까?
자바에서는 다음과 같이 처리하게 된다.
test = new StringBuffer(test).append("테스트").toString()
자동으로 변환해주기에 다음과 같이 나오는 것이지 원래는 StringBuffer를 이용하여 개발하는 게 맞다고 생각한다.
그래서 StringBuffer 자료형은 주로 문자열을 추가하거나 변경할 때 사용된다.
StringBuffer의 메서드들은 다음과 같다.
StringBuffer.append
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("test");
sb.append(" + ");
sb.append("추가 테스트");
System.out.println(sb);
}
}
append 메서드를 이용하여 StringBuffer로 선언한 sb 객체 안에 데이터를 넣는 과정이다.
StringBuffer는 다른 많은 기능들을 지원한다.
StringBuffer.insert
insert 객체는 다음과 같이 사용한다.
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("test");
sb.append(" + ");
sb.append("추가 테스트");
sb.insert(3, "어디에");
System.out.println(sb);
}
}
보시다시피 "어디에"라는 글자는 tes 다음에 위치하게 되었다.
앞에 있는 index 값이 위치가 되며, 3번째 위치는 tes뒤에 추가하게 된다.
(만약 맨 앞에 붙이고 싶다면 0을 쓰면 된다)
StringBuffer.substring
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("test");
sb.append(" + ");
sb.append("추가 테스트");
sb.insert(3, "어디에");
System.out.println(sb.substring(0,4));
}
}
다음은 StringBuffer의 substring (기존 String에도 있는 메서드)를 이용해봤다.
0부터 4자리까지 사용하는 거로 나와있다.
그럼 만약에 뒤에서 4자리를 자르고 싶을 땐 어떻게 해야 할까?
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("test");
sb.append(" + ");
sb.append("추가 테스트");
sb.insert(3, "어디에");
System.out.println(sb.substring(sb.length()-4));
}
}
잘 보면 4자리가 나온 것을 알 수 있다.(맨 앞 공백까지)
또 다른 기능들을 살펴보자.
StringBuffer.charAt
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("test");
sb.append(" + ");
sb.append("추가 테스트");
sb.insert(3, "어디에");
System.out.println(sb.charAt(3));
}
}
charAt 메서드는 해당 index 값에 위치한 글자를 "한 글자" 반환하는 메서드이다.
StringBuffer.reverse
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("test");
sb.append(" + ");
sb.append("추가 테스트");
sb.insert(3, "어디에");
System.out.println(sb.reverse());
}
}
reverse 메서드의 경우 출력해야 하는 값을 전부 반대로 뒤집어서 출력해주는 기능이다.
StringBuffer.replace
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("test");
sb.append(" + ");
sb.append("추가 테스트");
sb.insert(3, "어디에");
sb.replace(0, 4, "&&");
System.out.println(sb);
}
}
replace는 말 그대로 start index부터 end index까지 어떤 글자로 변환시켜주는 기능이다.
더 많은 기능이 있지만, 주로 사용하는 것들에 대해서 다루고, 나중에 더 필요한 기능이 있으면 추가적으로 정리하겠다.
마지막 메서드는 length()이다.
StringBuffer.length
String 때처럼 StringBuffer의 길이를 반환시켜주는 메서드이다.
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("test");
sb.append(" + ");
sb.append("추가 테스트");
sb.insert(3, "어디에");
System.out.println(sb);
System.out.println(sb.length());
}
}