티스토리 뷰

TIL

[Java] StringBuffer

Redirect 2024. 6. 21. 13:33
728x90

이직을 준비하면서 Spring에 대한 중요성이 느껴져서 다시 복습하기 전에 Java에 대한 개념을 좀 정리하고 가는 것이 좋을 것 같아서

다시 Java 공부를 시작했습니다.

순수 자바는 거의 5년만에 공부해보는 것 같네요,,

 

 

StringBuffer

StringBuffer는 문자열을 추가하거나 변경할 수 있는 자료형입니다.

String과는 달리 하나의 객체(메모리)를 사용한다는 점이 가장 큰 장점입니다.

StringBuffer에는 여러 메서드가 있는데 그 중 가장 먼저 append부터 알아보겠습니다.

 

 

append

 

public class StringBufferExample {
    public static void main(String [] args) {
        // 3-5 StringBuffer

        // mutable 객체
        StringBuffer sb = new StringBuffer("StringBuffer: 첫 만남은 ");
        sb.append("너무 어려워 ");
        sb.append("계획대로 ");
        sb.append("되는게 없어서");

        String result = sb.toString();

        System.out.println(result);
    }
}

 

append 메서드를 활용해서 문자열을 계속 추가하여 기존의 문자열을 변경시킬 수 있습니다.
또한 변경한 문자열을 출력하기 위해 toString의 사용도 가능합니다.

 

 

 

String과의 차이점

같은 자료형을 만약 String으로 구현했다면 어떨까요?

 

public class StringBufferExample {
    public static void main(String [] args) {

        // 총 4개의 String 객체가 만들어진다.
        // 메모리 낭비
        String test = "String: 첫 만남은 ";
        test += "너무 어려워 ";
        test += "계획대로 ";
        test += "되는게 없어서";

        System.out.println(test);
    }
}

 

출력은 StringBuffer와 똑같이 나오겠지만, 실행될 때 메모리 사용량이 차이납니다.

StringBuffer는 아까 말씀드린 것처럼 하나의 객체에 수정된 사항을 저장하지만

String은 변경할 때 마다 새로운 메모리를 할당하면서 새로운 String 객체가 만들어집니다.

 

그 이유는?

 

그 이유는 String은 값이 한 번 생성되면 바꿀 수 없는(immutable) 자료형이기 때문입니다. 

 

String의 여러 메소드(toUpperCase 등)를 사용해서 모양이 바뀌는 모습을 보면 문자열이 변경되는 것처럼 보이나, 사실은 또 다른 String 객체를 만들어서 리턴하는 것입니다.

 

 

그렇다고 해서 무조건 StringBuffer를 사용하는 것은 옳지 않습니다.
왜냐면 StringBuffer는 String보다 사용하는 메모리의 양도 많고 속도도 느리기 때문입니다.
따라서 만약 문자열에 수정사항이 많다면 StringBuffer를, 그렇지 않다면 String을 쓰는 것이 합리적인 선택입니다.

 

 

 

 

insert

 

insert 메서드를 통해 원하는 문자열을 원하는 위치에 넣을 수도 있습니다.
하지만 아래 예시와 같이 끝에 넣고자 한다면 StringBuffer의 전체길이를 구해서 넣는 것이 올바른 방법입니다.

 

    // 원하는 위치에 삽입
    // sb.insert(-1," x2"); // 에러 일어남
    sb.insert(sb.length(), " x2");
    System.out.println(sb.toString());

 

 

 

substring

 

만약 문자열에서 필요한 단어만 뽑아 표현하고 싶다면 substring을 쓰는 것도 좋은 방법입니다.
해당 메소드에 시작 위치와 끝 위치를 넣으면 해당 부분만큼 리턴합니다.

 

    sb = new StringBuffer("Hello jump to java");
    System.out.println(sb.substring(0,10));

 

 

 

StringBuilder와의 차이

 

비슷한 기능을 수행하는 자료형이 하나 있는데 바로 StringBuilder입니다. 

StringBuffer가 제공하는 메소드들을 StringBuilder도 제공합니다.

하지만 큰 차이점은 동기화를 보장하냐의 차이점 입니다.

StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하며, 멀티스레드 환경에서도 동기화를 지원합니다.
반면 StringBuilder는 동기화를 보장하지 않습니다.


따라서 동기화가 중요한 멀티스레드 환경에서 개발을 진행한다면 StringBuffer를 사용하고

단일 스레드 환경이라면 StringBuilder를 사용하는 것이 좋습니다.

728x90

'TIL' 카테고리의 다른 글

[OS] 가상 메모리, 동기와 비동기  (0) 2022.08.15
[OS] 프로세스와 스레드, Thread-safe  (0) 2022.08.13
[Network] DNS, RESTful  (0) 2022.08.02
[Network] Socket, PDU  (0) 2022.08.01
[Network] HTTP/HTTPS와 CORS  (0) 2022.07.31
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크