String, StringBuilder, StringBuffer

hoyong.eom·2024년 7월 10일

알고리즘

목록 보기
3/7
post-thumbnail

String, StringBuilder, StringBuffer 이해하기

오늘은 String으로 concat 또는 + 연산을 이용해서 문자열을 이어붙이다가 아주 낭패를 보게 되서 포스팅으로 정리해놓으려고 한다.

StringBuilder, StringBuffer

StringBuilder와 StringBuffer는 문자열을 추가하거나 변경할때 주로 사용하는 자료형이다.

String으로 concat() 이나 + 연산으로 문자열을 추가하거나 변경할 순 있다.
다만, 이 경우 내용이 합쳐진 새로운 String 인스턴스가 생성된다. 따라서 문자열을 많이 결합하고 변경할 수록 속도와 공간의 낭비가 매우 심할 수 있다.

StringBuffer와 StringBuilder는 내부적으로 버퍼를 갖고 있어 문자열을 바로 추가할 수 있어 공간의 낭비도 없으며 문자열 연산 속도도 매우 빠르다.
StringBuffer와 StringBuilder는 사용법이 동일하다. 다만, StringBuffer는 멀티 스레드 환경에서 안전하고, 그에 반해 StringBuilder는 멀티 스레드 환경을 보장해주진 못하지만 성능 자체는 가장 우수하다.

일반적으로 StringBuffer의 버퍼는 기본값으로 16개의 문자를 저장할 수 있는 크기로 주어지며 생성자를 통해서 그 크기를 별도로 설정할 수 도 있다.
문자열 연산중에 버퍼의 크기를 넘게 되면 자동으로 버퍼를 증가시킨다. 다만 이 경우 효율이 떨어질 수 있다.

    public static void main(String[] args) {

        StringBuilder sb = new StringBuilder();
        System.out.println(sb.capacity());
    }
    
    > Task :Main.main()
	16

String 과 StringBuffer, StringBuilder

String

기본적으로 Java에서 String 객체는 불변이다.
불변이라는 말은 값을 변경할 수 없음을 의마한다.
즉, 한번 할당된 공간은 변하지 않음을 의미하며 이를 불변이라 부른다.

만약, 아래와 같은 코드가 있다고 생각해보자.

        String str = "Hello";

        str += " World";

        System.out.println(str);

concat()이나 + 연산 말고도 trim 이나 toUpperCase 또한 문자열이 변경되는것이 아니라 또 다른 String 객체를 생성하여 리턴하는 형태이다.

String을 불변으로 설정함으로써 얻을 수 이점도 존재한다.

  1. 캐싱 : String Pool에 문자열을 하나만 저장해서 다시 사용할 수 있도록 하며, 이에 따라 힙 공간이 절약된다.
  2. 동기화 : 불변 객체는 수정이 불가능하기 때문에 스레드 안정적이다.

StringBuffer, StringBuild

StringBuffer와 StringBuild는 String과 달리 버퍼의 크기를 유연하게 늘려주는 가변 객체라고 볼 수 있다.
따라서, 위 2개의 클래스는 내부 버퍼에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 유연하게 수행할 수 있다.

그렇기 때문에 문자열의 추가 ,수정 ,삭제는 String보다 훨씬 빠르게 작업할 수 있다.

참고

https://inpa.tistory.com/entry/JAVA-%E2%98%95-String-StringBuffer-StringBuilder-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90

0개의 댓글