StringBuilder 와 StrinBuffer

SionBackEnd·2022년 7월 4일
0

자바 스터디

목록 보기
6/21
post-thumbnail

String과 Stringbuilder, StringBuffer의 차이점

Java에서 String 객체는 한번 값이 할당되면 그 공간은 변하지 않는다. 하지만 Stringbuilder나 StringBuffer 객체는 한번 값이 할당되더라도 한번 더 다른 값이 할당되면 할당된 공간이 변하는 특성을 갖고 있다..

즉, String 객체는 다른값을 할당받으면 주솟값이 달라지지만, Stringbuilder나 StringBuffer 객체는 주솟값이 변경되지 않고 값이 변하는 특징이 있다.

값이 저장되는 공간

String 을 리터럴 값으로 할당하는 경우엔 Heap 메모리 영역안의 특별한 메모리 공간인 String constant pool 에 저장된다. 그래서 equals를 했을때 만약 String constant pool안에 아래와 같이 두가지 값이 할당된다는것은

String A = "Hello";
String B = "Hello";

A와 B가 동일한 주솟값을 가리키고 있다고 생각해도된다.

하지만, StringBuilder 와 StrinBuffer은 객체를 생성하기 때문에 내부의 값이 동일하더라도 equals를 통해서 값을 비교할수가 없는것이다.

Stringbuilder과 StringBuffer의 차이점

두 클래스의 기능은 동일하지만 한 가지 차이점이 존재한다. 바로 동기화(Synchronization)에서의 차이점이다.
StringBuilder는 동기화를 지원하지 않는 반면, StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있다.

그 이유는 StringBuffer는 메서드에서 synchronized 키워드를 사용하기 때문인데 java에서 synchronized 키워드는 여러개의 스레드가 한 개의 자원에 접근할려고 할 때, 현재 데이터를 사용하고 있는 스레드를 제외하고 나머지 스레드들이 데이터에 접근할 수 없도록 막는 역할을 수행한다.

즉, StringBuffer를 사용할때는 동기화가 필요할 경우 사용하면되고, Stringbuilder를 사용할때는 동기화가 필요없을 경우 사용하면된다.
하지만 중요하게 알아둘점은 Stringbuilder는 동기화를 지원하지 않는 반면 속도면에서는 StringBuffer 보다 성능이 좋다.

정리

String을 사용 해야 할 때

변하지 않는 문자열을 자주 사용할 경우

Stringbuilder를 사용 해야 할 때

단일 스레드 환경 과 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우

StringBuffer를 사용 해야 할 때

멀티 스레드 환경 과 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우

사용 가능 메소드

[ String 클래스와 동일 메소드 ]

charAt() - 특정 인덱스 위치의 문자 반환
indexOf() / lastIndexOf() - 문자열 검색해서 위치 반환
length() - 문자열 길이 반환
replace() - 검색된 문자열 교체
substring() - 특정 인덱스 범위 내 문자열을 복사해서 새로 생성된 인스턴스 반환
toString() - 문자열 출력

그외

append()

append() 메서드는 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가한다. 이 메서드는 String 클래스의 concat() 메서드와 같은 결과를 반환하지만, 내부적인 처리 속도가 훨씬 빠르다.

StringBuffer str = new StringBuffer("Java");
System.out.println("문자열 : " + str);
System.out.println(str.append(" programming"));
System.out.println("append() 메서드 호출 후 문자열 : " + str);

capacity()

capacity() 메서드는 인스턴스의 현재 버퍼 크기를 반환한다. 길이가 4인 문자열로 StringBuffer 인스턴스를 생성하면, 기본적으로 생성되는 여유 버퍼 크기인 16에 문자의 길이인 4를 더한 총 20개의 문자를 저장할 수 있는 버퍼가 생성되는 것을 확인할 수 있다.

public class Study {

	public static void main(String[] args) {

		StringBuilder a = new StringBuilder("Hello");
		
		System.out.println(a.length());		// 5
		System.out.println(a.capacity()); 	// 21
		
		a.append(" World");
		System.out.println(a);             	// "Hello World"
		
		System.out.println(a.length()); 	// 11
		System.out.println(a.capacity()); 	// 21
		
		a.append(" Hi everybody!!!!");
		System.out.println(a);             	// Hello World Hi everybody!!!!

		System.out.println(a.length()); 	// 28
		System.out.println(a.capacity()); 	// 44		
	}
}
  • length()는 실제 데이터가 들어있는 문자열 자체의 길이이고 capacity()는 현재 배열 사이즈
  • append() 등 문자열 조정할 때 배열 사이즈가 자동으로 변경됨

delete(int start, int end)

delete() 메서드는 전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거합니다. 또한, deleteCharAt() 메서드를 사용하면 특정 위치의 문자 한 개만 제거할 수도 있습니다.

public class Study {

	public static void main(String[] args) {

		StringBuilder a = new StringBuilder("Hello");

		a.append(" World");
		System.out.println(a);  // "Hello World"
		
		a.delete(6, 9);         // (6~8 삭제)
		System.out.println(a);  // "Hello ld" 
	}
}

delete() 메서드는 첫 번째 매개변수로 전달된 인덱스부터 두 번째 매개변수로 전달된 인덱스 바로 앞의 문자까지를 삭제하는 메서드이다.

deleteCharAt(int index)

특정 인덱스의 한 문자만 삭제
delete() 메소드에서 범위를 한 글자만 잡는 것과 동일한 효과 => delete(1,2) 동일

insert(int index, String string)

insert() 메서드는 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 지정된 인덱스 위치에 추가한다. 이때 전달된 인덱스가 해당 문자열의 길이와 같으면, append() 메서드와 같은 결과를 반환한다.

StringBuffer str = new StringBuffer("Java Programming!!");
System.out.println("문자열 : " + str); // 문자열 : Java Poigramming!!
System.out.println(str.insert(4, "Script")); 
System.out.println("insert() 메서드 호출 후 문자열 : " + str); //insert() 메서드 호출 후 문자열 : JavaScript Programming
profile
많은 도움 얻어가시길 바랍니다!

0개의 댓글