[JAVA] String VS StringBuilder VS StringBuffer

goyoung·2024년 1월 8일
1

JAVA

목록 보기
6/6

| 자바에서 대표적으로 문자열을 다루는 자료형 클래스 (3가지)

  • StringBuffer
  • String
  • StringBuilder

StringBuilder / StringBuffer 클래스

: 문자열을 연산(추가하거나, 변경)할 때 주로 사용

=> 자바에서는 이러한 문자열 연산을 전용으로 하는 자료형을 따로 만들어 제공해주는데, StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가지게 되어, 문자열을 바로 추가할 수 있어 공간의 낭비도 없으며 문자열 연산 속도도 매우 빠르다는 특징이 있다.

//StringBuffer sbf 객체 생성
StringBuffer sbf=new StringBuffer();

//append메소드를 이용해 문자열 추가
sbf.append("Hello, "); 
sbf.append("Welcome to ");
sbf.append("Java World!");

String result=sbf.toString();
System.out.println(result); //Hello, Welcome to Java World!

// => String 자료형을 + 로 결합하는 것보단 복잡해 보일 수 있으나, 연산 속도가 더 빠르다는 장점이 있다.

StringBuilder와 StringBuffer의 차이점은?

=> StringBuilder와 StringBuffer의 사용법은 동일하다.
=> 그러나 멀티쓰레드(Thread)에서 안전(Safe)하냐는 차이점이 있고, StringBuffer는 멀티 쓰레드에 안전한 반면, StringBuilder는 그렇치 않다.
=> 차이점은 StringBuilder는 문자열 파싱 성능이 가장 우수하다는 점이고, StringBuffer는 멀티스레드 환경에서 안전하다는 장점이 있다.


=> String 자료형만으로도 + 연산이나, concat() 메소드를 이용해 문자열을 이어붙일 순 있으나, + 연산자를 이용해 String 인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성하게 되어 결합하면 할수록 공간의 낭비뿐만 아니라 속도 또한 매우 느려지는 단점이 있음.

//String 자료형을 이용한 연산

String result="";
result += "Hello, ";
result += "Welcome to ";
result += "Java World!";

System.out.println(result); //Hello, Welcome to Java World!
//단순해보이지만 연산 속도가 느리다는 단점 발생

* StringBuffer(+ StringBuilder)

=> 버퍼(데이터 공간) 크기의 기본값은 16개의 문자를 저장할 수 있는 크기
=> 생성자를 통해 그 크기를 별도로 설정할 수 있음
=> 문자열 연산 중에 할당된 버퍼의 크기를 넘게 되면 자동으로 버퍼를 증가시킬 수 있으나, 효율이 떨어질 수 있으므로 버퍼의 크기는 넉넉하게 잡는 것이 좋다.

//버퍼 크기 설정
StringBuffer sbf=new StringBuffer(50);

//버퍼의 크기는 50이 되었다.
System.out.println(sb.capcity()); //50

======================================

//16버퍼 크기의 기본 StringBuffer
StringBuffer sbf=new StringBuffer();

//sbf.capacity() - StringBuffer 변수의 배열 용량 크기 반환 확인
System.out.println(sb.capcity()); //16

//40길이의 문자열 append
sbf.append("1111111111111111111111111111111111111111");
		
System.out.println(sbf.capacity()); //40

* StringBuffer( + StringBuilder) 내장 메소드

String str = "abcdefg";
StringBuffer sb = new StringBuffer(str); // String -> StringBuffer

  • System.out.println("처음 상태 : " + sb); // 처음상태 : abcdefg

  • System.out.println("문자열 String 변환 : " + sb.toString()); // StringBuffer를 String으로 변환하기

  • System.out.println("문자열 추출 : " + sb.substring(2,4));

    // 문자열 추출하기 , 인덱스 2번부터 4번 직전까지의 문자열 출력
  • //append는 문자열 끝에 새로운 내용 추가
    StringBuffer sbf=new StringBuffer("Hello");
    sbf.append(" World!");
    System.out.println(sbf.toString)//"Hello World"

  • //insert는 (지정된 위치, 추가할 문자열)
    System.out.println("문자열 추가 : " + sb.insert(2,"추가")); // 문자열 추가하기

  • System.out.println("문자열 삭제 : " + sb.delete(2,4)); // 문자열 삭제하기

  • System.out.println("문자열 연결 : " + sb.append("hijk")); // 문자열 붙이기

  • System.out.println("문자열의 길이 : " + sb.length()); // 문자열의 길이구하기

  • System.out.println("용량의 크기 : " + sb.capacity()); // 용량의 크기 구하기

  • System.out.println("문자열 역순 변경 : " + sb.reverse());

    // 문자열 뒤집기
  • System.out.println("마지막 상태 : " + sb); // 마지막상태 : kjihgfedcba

* String VS StringBuilder VS StringBuilder

👍String을 사용해야 할 때 :

  • String은 불변성
  • 연산 속도 느림
  • 문자열 연산이 적고 변하지 않는 문자열을 자주 사용할 경우

👍 StringBuilder를 사용해야 할 때 :

  • StringBuilder는 가변성
  • 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우
  • 동기화를 지원하지 않아, 단일 쓰레드이거나 동기화를 고려하지 않아도 되는 경우
  • 속도 면에선 StringBuffer보다 성능이 좋다.

👍 StringBuffer를 사용해야 할 때 :

  • StringBuffer는 가변성
  • 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우
  • 동기화를 지원하여, 멀티 쓰레드 환경에서도 안전하게 동작

=> 웹이나 소켓 환경과 같이 비동기로 동작하는 경우(다중 스레드가 요청을 처리하는 상황)가 많을 땐 StringBuffer를 사용하는 것이 안전하다.

=> 현업에서는 자바 어플리케이션을 대부분 멀티 스레드 이상의 환경에서 돌아가지 때문에 웬만하면 안정적인 StringBuffer로 통일하여 사용하는 것이 좋다.(StringBuffer와 StringBuilder의 속도 차이는 미미한 편)


<메모리 구조 참고>

  • String 메모리 구조
  • StringBuffer 메모리 구조

<성능 비교>

참고 :
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
++Chat GPT

0개의 댓글