본문 바로가기

Programming/Java

[Java] StringBuilder 클래스

반응형

문자열을 저장하는 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 클래스의 주요 메소드는 다음과 같다.

 

https://palpit.tistory.com/879

 

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년차 생활의 이해
    }
}

 

참고

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968481475&orderClick=LAG&Kc=

 

이것이 자바다 - 교보문고

신용권의 Java 프로그래밍 정복 | 15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서. 저자 직강의 인터넷 강의와 Q/A를 위한 커뮤니티(네이커 카페)까지 무

www.kyobobook.co.kr

반응형