본문 바로가기
BackEnd/Java

[Java] String Builder / String Buffer

by summer_light 2021. 7. 9.

StringBuilder / StringBuffer

String은 소위 불변 객체라고 한다. 2개의 String 객체가 있을 때, 두 객체를 더하는 연산을 하면 새로운 String을 생성한다. 즉 더하는 행위는 메모리 할당과 메모리 해제를 발생시키며 더하는 연산이 많아진다면 성능이 낮아지는 결과로 이어질 수 있다.

 

StringBuilder/StringBuffer는 String끼리 더할 때 새로운 객체를 생성하는 것이 아니라, 기존의 데이터에 더하는 방식을 사용하므로 속도가 빠르고 상대적으로 부하가 적다. 따라서 긴 문자열을 더하는 상황이 발생할 경우 StringBuilder를 적극적으로 사용하는 것이 좋다. StringBuilder는 클래스 안에 배열 공간을 미리 만들어놓고 문자열을 추가하는 함수가 호출되면 추가되는 문자열을 해당 배열 공간에 바로 추가한다. 만약 추가하다가 배열 공간이 부족해지면 이때만 공간을 늘려서 기존 문자열을 복사하는 방식이기 때문에 복사하는 횟수가 현저히 줄어들어 시간이나 공간적으로 매우 효율적이다.

 

※ 그러나 최근 자바 버전이 올라가서 String을 +로 이어붙이는 것과 builder/Buffer를 사용하는 것이 바이트 코드로 변환할 때 같아진다고 한다는 말이 있다. 그렇다면 굳이 builder를 고집할 이유는 없어지고, 동기화가 필요할 때만 buffer를 쓰고 그 외엔 가독성이 좋은 +를 이용하면 될 것 같다. 

 

StringBuilder 와 StringBuffer의 차이점 

 StringBuilder : 단일 스레드 환경에서만 가용하도록 설계
 *  StringBuilder(int 값); 값만큼 문자를 저장하고 초기 버퍼를 가진다.
 *  버퍼가 부족할 경우 자동으로 버퍼 크기를 늘리기 때문에 초기 버퍼가 중요하지 않다.

 

StringBuffer : 멀티 스레드 환경에서 사용할 수 있도록 동기화가 되어있다. 
 *  기본 생성자로 생성하면 16개 문자가 들어가도록 초기 버퍼를 만든다.

 

왜 멀티 스레드 환경에서는 StringBuffer를 사용해야하는지에 대해 잘 설명된 글이 있었다. 

출처: https://novemberde.github.io/

 

예제 01. StringBuilder

StringBuilder는 String과 다르게 sb="java";와 같이 작성하면 오류가 발생하므로 주의해야 한다. 

  • .append("a"): 뒤에 "a" 추가
  • .insert(인덱스, "a"): 해당 위치에 "a" 추가
  • .deleteCharAt(인덱스): 해당 위치의 문자 제거 
  • .delte(시작, 끝) 시작부터 끝 직전(끝-1)까지 제거 
  • .replace(2, 6, "SPRING"); index 2~5까지의 문자를 SPRING으로 교체
  • .toString: StringBuilder를 String으로 변환 

public class String02 {
	public static void main(String[] args) {
		
		StringBuilder sb = new StringBuilder();
		//sb = "java"; 와 같이 작성하면 오류
		System.out.println(sb);
		
		//.append("a"): 뒤에 "a" 추가
		sb.append("추가");
		sb.append("JAVA");
		
		System.out.println(sb);//추가JAVA
		
		//.insert(인덱스, "a"): 해당 위치에 "a" 추가
		sb.insert(2, "+");
		System.out.println(sb);//추가+JAVA
				
		//.deleteCharAt(인덱스): 해당 위치의 문자 제거 
		sb.deleteCharAt(3);
		System.out.println(sb);//추가+AVA
		
		//.delte(시작, 끝) 시작부터 끝 직전(끝-1)까지 제거 
		sb.delete(1, 4);
		System.out.println(sb);//추VA
		
		//replace(); 원하는 위치의 문자,문자열을 교체하기
		//replace(2, 6, "SPRING"); index 2~5까지의 문자를 SPRING으로 교체
		sb.replace(1, 2, "SPRING");
		System.out.println(sb);//추SPRINGA
		
		//.toString: StringBuilder를 String으로 변환 
		String str = sb.toString();
		System.out.println(str);
				
	}
}

 

 

'BackEnd > Java' 카테고리의 다른 글

[Java] 상속과 인터페이스  (0) 2021.07.13
[Java] 자바 API 읽기  (0) 2021.07.09
[Java] 생성자 Constructor  (0) 2021.07.09
[Java] 텍스트 형식 Text Format  (0) 2021.07.08
[Java] 배열 복사 (깊은 복사 vs 얕은 복사)  (0) 2021.07.06

댓글