문자열을 저장하는 String은 내부의 문자열을 수정할 수 없다.
예를 들면, String의 replace()메소드는 내부의 문자를 대치하는 것이 아닌, 대치된 새로운 문자열을 리턴한다.(=기존의 문자열을 수정하는 것이 아니다.)
String 객체도 마찬가지다.
String data = "abc";
data += "def";
"abc"에 "def"가 추가되어 한 개의 String객체가 사용된 것처럼 생각할 수 있으나, String객체는 내부 데이터를 수정할 수 없다. 때문에, "abc"에 "def"가 추가된 "abcedf"라는 새로운 String객체가 생성되고,
변수data는 새로 생성된 String객체를 참조하게 되는 것이다.
즉, +연산자를 많이 사용할 수록 새로운 String객체 수가 늘어나는 것이라 프로그램 성능이 떨어진다.
그래서 문자열 변경이 많은 작업이면 String클래스 보다는 StringBuffer, StringBuilder 클래스를 사용하는 것이 좋다.
이 두 클래스는 내부 버퍼(*buffer : 데이터를 임시로 저장하는 메모리)에 문자열을 저장해 두고, 그안에서
추가, 수정, 삭제 작업을 할 수 있도록 설계되어 있다.
String처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있는 것이다!!
두 클래스의 사용방법은 동일하나 차이점은 StringBuffer은 멀티스레드 환경에서 사용가능하나 StringBuilder는 단일스레드 환경에서만 사용하도록 설계되어있다는 점이 다르다.
StringBuilder클래스로 공부하기로 한다.
먼저 StringBuilder 객체를 생성하는데, 초기 버퍼를 생성해주지만 버퍼는 부족하면 계속 늘려지기때문에 초기값은 그다지 중요하지는 않다고 한다.
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder(17);
StringBuilder sb = new StringBuilder("Java");
이렇게 StringBuilder 객체가 생성되었으면 버퍼 내에서 문자 추가, 삽입, 삭제의 작업을 할 수 있고, 그 작업을 하기 위해 아래의 메소드들을 사용한다.
메소드 | 설명 |
append(...) | 문자열 끝에 주어진 매개값을 추가 |
insert(int offset,...) | 문자열 중간에 주어진 매개값을 추가 |
delete(int start, int end) | 문자열의 일부분 삭제 |
deleteCharAt(int index) | 문자열에서 주어진 index의 문자를 삭제 |
replace(int start, int end, String str) | 문자열의 일부분을 다른 문자열로 대치 |
reverse() | 문자열의 순서를 뒤바꿈 |
setCharAt(int index, char ch) | 문자열에서 주어진 index의 문자를 다른 문자로 대치 |
append()메소드만 코드로 적용해보았다. 나머지 메소드 적용도 어렵지 않았다.
...
StringBuilder sb = new StringBuilder();
sb.append("java");
sb.append("program study");
System.out.println(sb.toString());
코딩테스트 문제를 풀때 String클래스만으로 안풀리는게 많았는데 좀 더 수월해질 것 같다.
'Language > JAVA' 카테고리의 다른 글
5 (0) | 2024.04.07 |
---|---|
A1 (0) | 2024.03.18 |
StringTokenizer 클래스 (0) | 2023.07.07 |
API_3. String 클래스 (0) | 2023.07.06 |
API_2. java.util패키지의 Objects 클래스 (0) | 2023.07.06 |