문자열을 저장하는 String은 내부의 문자열을 수정할 수 없다. String의 replace() 메소드는 내부의 문자를 변경하는 것이 아니라, 변경된 새로운 문자열을 리턴한다. String 객체를 + 연산할 경우에도 마찬가지다.
String data = "ABC";
data += "DEF";
위 예시에서 "ABC"에 "DEF"가 추가되었기 때문에 "ABCDEF"라는 하나의 String 객체로 변경되었다고 생각할 수 있지만, String 객체는 내부 데이터를 수정할 수 없으므로 "ABC"에 "DEF"가 추가된 "ABCDEF"라는 새로운 String 객체가 생성된다. 그리고 data 변수는 새로 생성된 String 객체를 참조하게 된다.
문자열을 결합하는 + 연산자를 남용하면 그만큼 string 객체의 수가 늘어나기 때문에 프로그램 성능 저하의 원인이 될 수 있다. 문자열 변경 작업이 잦을 경우 String 클래스 사용 보다는 java.lang 패키지의 StringBuffer 또는 StringBuilder 클래스를 사용하는 것이 좋다. 이 두 클래스는 내부 버퍼(buffer_데이터를 임시로 저장하는 메모리)에 문자열을 저장해 두고 그 안에서 추가, 수정, 삭제 작업을 할 수 있도록 설게되어 있다. String처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있는 것이다.
StringBuffer와 StringBuilder의 사용법은 동일하지만 차이점은 StringBuffer는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하다. 반면 StringBuilder는 단일 스레드 환경에서만 사용하도록 설계되어 있다.
StringBuilder 클래스의 기본 생성자인 StringBuilder()는 16개의 문자들을 저장할 수 있는 초기 버퍼를 만들고, StringBuilder(int capacity) 생성자는 capacity로 주어진 개수만큼 문자들을 저장할 수 있는 초기 버퍼를 만든다. StringBuilder는 버퍼가 부족할 경우 자동으로 버퍼 크기를 늘리기 때문에 초기 버퍼의 크기는 그다지 중요하지 않다.
StringBuilder(String str) 생성자는 str로 주어진 매개값을 버퍼의 초기값으로 저장한다.
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder(16);
StringBuilder sb = new StringBuilder("Java");
StringBuilder 클래스의 주요 메소드는 다음과 같다.
append(), insert() 메소드는 매개 변수가 다양한 타입으로 오버로딩되어 있기 때문에 대부분의 값을 문자로 추가 또는 삽입할 수 있다. 자세한 내용은 https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html에서 확인 가능하다.
아래 코드는 StringBuilder를 이용해 문자를 삽입, 대치, 문자 길이를 구하는 코드이다.
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("대학 ");
sb.append("생활의 ");
sb.append("이해");
System.out.println(sb.toString());
sb.insert(3, "1학년 "); // (공백포함)index 3의 위치 뒤에 문자 삽입
System.out.println(sb.toString()); // 대학 1학년 생활의 이해
sb.replace(0, 6, "사회 1년차"); // sb.replace(시작 인덱스, 마지막 인덱스, 대치할 문자)
System.out.println(sb.toString()); // 사회 1년차 생활의 이해(시작 인덱스 ~ 마지막 인덱스 이전 까지의 문자열 대치)
int length = sb.length();
System.out.println("총문자수: " + length); // 13
String result = sb.toString(); // 버퍼에 있는 것을 String 타입으로 리턴
System.out.println(result); // 사회 1년차 생활의 이해
}
}
참고
'Programming > Java' 카테고리의 다른 글
[Java] static 키워드 유무에 따른 변수 값의 변화 (0) | 2021.11.30 |
---|---|
[Java] Enum 클래스 (0) | 2021.11.18 |
[Java] 2차원 배열의 행(row) 길이와 열(column) 길이 (0) | 2021.09.25 |
[Java] for문 동작 순서 (0) | 2021.09.25 |
[Java] 클래스 생성자 선언 시 사용되는 this와 this() (0) | 2021.09.16 |