String vs StringBuffer/StringBuilder

  • String과 StringBuffer/StringBuilder 클래스의 가장 큰 차이점은 String은 불변(immutable)의 속성을 갖는다는 점
  • 아래 코드를 보면 str 변수는 world라는 문자열을 추가해 hellow world로 변한 것 처럼 보이지만 그림을 보면 hello 라는 데이터는 그대로 남아있고 hellow world 가 따로 메모리에 생성되고 str 변수가 hello world를 가리키게 된것이다.
String str = "hello";   // String str = new String("hello");
str = str + " world";  // [ hello world ]

  • 문자열 추가,수정,삭제 등의 연산이 비번하게 발생하는 알고리즘에서 String클래스를 계속 사용하면?

힙 메모리에 많은 임시 가비지가 생성되어 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 됩니다.

StringBuffer vs StringBuilder

  • StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점(thread-safe) 입니다. 참고로 String도 불변성을 가지기때문에 마찬가지로 멀티쓰레드 환경에서의 안정성(thread-safe)을 가지고 있습니다.
  • StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다.

StringBuffer, StringBuilder 주요 api

  • [ String 클래스와 동일 메소드 ]
charAt() - 특정 인덱스 위치의 문자 반환
indexOf() / lastIndexOf() - 문자열 검색해서 위치 반환
length() - 문자열 길이 반환
replace() - 검색된 문자열 교체
substring() - 특정 인덱스 범위 내 문자열을 복사해서 새로 생성된 인스턴스 반환
toString() - 문자열 출력
  • [ append() ]

문자열 추가

StringBuilder a = new StringBuilder("Hello");
a.append(" World");
System.out.println(a); 		// "Hello World"	
  • [ capacity() ]

String 클래스와 다르게 char[] 배열 사이즈를 여유 있게 잡아둠
현재 char[] 배열이 가진 사이즈 정보를 반환
length()는 실제 데이터가 들어있는 문자열 자체의 길이이고 capacity()는 현재 배열 사이즈
append() 등 문자열 조정할 때 배열 사이즈가 자동으로 변경됨

		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		
  • [ delete() ]
  • 매개변수로 전달받은 인덱스 사이의 문자열 제거
		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" 
  • [ deleteCharAt() ]
  • 특정 인덱스의 한 문자만 삭제
		StringBuilder a = new StringBuilder("Hello");

		a.append(" World");
		System.out.println(a); 				// "Hello World"
		
		// a.delete(6,7) 과 같음
		a.deleteCharAt(6);
		System.out.println(a);				// "Hello orld"
  • [ insert() ]
		StringBuilder a = new StringBuilder("He World");
		
		a.insert(2, "llo");
		System.out.println(a);			// "Hello World"
		
		a.insert(5, 55);
		System.out.println(a); 			// "Hello55 World"

'Java&Spring' 카테고리의 다른 글

[java] 제네릭스(Generics)이란?  (0) 2022.06.10
복사했습니다!