| 자바에서 대표적으로 문자열을 다루는 자료형 클래스 (3가지)
- StringBuffer
- String
- StringBuilder
: 문자열을 연산(추가하거나, 변경)할 때 주로 사용
=> 자바에서는 이러한 문자열 연산을 전용으로 하는 자료형을 따로 만들어 제공해주는데, 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!
//단순해보이지만 연산 속도가 느리다는 단점 발생
=> 버퍼(데이터 공간) 크기의 기본값은 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
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을 사용해야 할 때 :
👍 StringBuilder를 사용해야 할 때 :
👍 StringBuffer를 사용해야 할 때 :
=> 웹이나 소켓 환경과 같이 비동기로 동작하는 경우(다중 스레드가 요청을 처리하는 상황)가 많을 땐 StringBuffer를 사용하는 것이 안전하다.
=> 현업에서는 자바 어플리케이션을 대부분 멀티 스레드 이상의 환경에서 돌아가지 때문에 웬만하면 안정적인 StringBuffer로 통일하여 사용하는 것이 좋다.(StringBuffer와 StringBuilder의 속도 차이는 미미한 편)
<메모리 구조 참고>
<성능 비교>