[JAVA] String & StringBuffer & StringBuilder

지누초이·2024년 3월 13일
0

JAVA

목록 보기
7/7
post-thumbnail

String, StringBuffer, StringBuilder 모두 Java의 문자열 클래스들이다.

String

  • Immutable(불변)
    • 한 번 할당된 공간이 변하지 않음
    • 초기공간과 다른 값에 대한 연산에서 많은 시간과 자원 사용
    • 캐싱, 보안, 동기화의 이점
      • 캐싱 : 각 리터럴 문자열 하나만 저장하여 재사용하거나 캐싱을 통해 힙 공간을 절약할 수 있음
      • 보안 : 가변일 경우 참조값 변경을 통한 애플리케이션 보안 문제 발생 가능
      • 동기화 : 동시에 실행되는 여러 스레드에서 안정적으로 공유 가능
  • 문자열 연산 시 새로운 String 인스턴스를 생성으로 인한 공간 낭비 및 속도 저하
    • 이전 인스턴스는 GC의 제거 대상이 됨
  • 추가 연산
    • +=
    • concat() 메소드
  • 비교 연산
    • equals() 메소드
  • thread safe

StringBuffer

  • Mutable(가변)
  • 문자열 연산에 주로 사용
  • 공간의 낭비가 없고 문자열 연산 속도가 빠름
  • 내부적으로 독립적인 공간(버퍼)를 갖고 있어서 동일 객체내부에서 문자열 변경 가능
  • 추가 연산
    • append() 메소드
  • 비교 연산
    • toString() 을 통해 String 객체로 변환 후 equals() 로 비교
    • equals() 를 오버라이딩 하지 않으므로 == 와 같은 값을 갖게됨
StringBuffer sb1 = new StringBuffer("str");
StringBuffer sb2 = new StringBuffer("str");
System.out.println(sb1.equals(sb2));	// false;
System.out.println(sb1.toString().equals(sb2.toString()));	// true;
System.out.println(sb1.toString().contentEquals(sb2));	    // true;
  • 메소드 사용 예시
StringBuffer sb = new StringBuffer();
System.out.println(sb.capacity());	// Default : 16

String str = "tmpstr";
sb = new StringBuffer(str);			// String to StringBuffer
str = sb.toString();				// StringBuffer to String
String str2 = sb.substring(2, 5);	// 인덱스 [2, 5) 추출 -> "pst"
sb.length();						// 문자열 길이 -> 6
sb.insert(2, "INS");				// 인덱스 2에 "INS" 추가 -> "tmINSpstr" 
sb.delete(2, 4);					// 인덱스 [2, 4) 제거 -> "tmSpstr"
sb.append("APP");					// 문자열 연결 -> "tmSpstrAPP"
sb.reverse();						// 문자열 뒤집기 -> "PPArtspSmt"

StringBuilder

  • StringBuffer와 대부분 동일하나, 멀티 스레드 환경에서 safe 여부의 차이 존재
    • StringBuilder
      • thread unsafe
      • 동기화 지원 x
      • 비동기를 사용하지 않거나 싱글 스레드에서 StringBuffer보다 좋은 성능(속도)으로 사용 가능
    • StringBuffer
      • thread safe
      • 동기화 지원 o
      • 소켓환경처럼 비동기로 동작하는 경우가 많을 때 안전
      • 대부분은 멀티 스레드 환경이므로 StringBuffer를 사용하는 것이 좋음

0개의 댓글