JAVA/about java

[String] String vs StringBuffer vs StringBulider

dev_rosieposie 2023. 8. 22. 18:03

시작하기 전 ...

String vs StringBuffer vs StringBulider을 정확히 이해하고 어느시점에 적재적소로 사용할 것인지 다시 한번 정리가 필요하다고 판단하여 포스팅을 하게 되었다!.. 더보기

 

stirng 빈 값 체크 참고

 

[String] String 빈 값 및 Null 체크

Goal StringUtils이 제공하는 빈 값과 Null체크를 하는 메소드의 각 차이점을 알아본다 == 와 equals()의 차이를 알아본다 String.valueOf()메소드에 대해 알아본다 기존 코드에서의 빈 값 및 null 체크 // 계약

dev-rosiepoise.tistory.com

 

Goal

  1. String에 대해서 알아본다
  2. StringBuffer에 대해서 알아본다
  3. StringBulider에 대해서 알아본다

String이란

참조형 데이터 타입으로 실제 사용은 기본 타입 처럼 사용한다.

public final class String implements Serializable, Comparable<String>, CharSequence {

서로 다른 객체를 반환하는 String

public static void main(String [] args){

    String a = "rose";

    System.out.println(a + " " + System.identityHashCode(a)); //문자열과 메모리 주소 출력
    a = a+"2";
    a = a+"3";
    System.out.println(a + " " + System.identityHashCode(a));
}

결과

rose 589446616
rose23 2109957412

  • String은 heap에 실제값 저장 / stack에 주소값 저장과 같이 저장한다.
  • 리터럴은 String Constant pool에 위치
  • 객체는 heap 영역에 할당
  • String은 크기가 고정되어 있기 때문에 내부의 문자열을 수정할 수 없다
  • 새로운 문자열이 만들어지면 새로운 객체가 생성되고 기존 객체는 버려지는데 (= GC의 대상) = 자원 낭비
  • 문자열 연산이 많아질 때 계속해서 객체를 만드는 오버헤드가 발생하므로 성능이 떨어질 수 밖에 없다
  • 하지만 Imutable 속성 때문에, thread-safe하다
  • 연산이 적고 문자열을 읽을 일이 많은 경우에는 String클래스의 사용이 더 적절하다.
  • +로 문자열을 더하는 연산을 한다.

절대 사용하면 안되는 메소드 intern()

new String(String)으로 생성한 문자열 객체라고 할지라도, String Constant pool에 해당 값이 있으면 그 값을 참조하는 객체를 리턴한다(= 동일한 주소값을 리턴). 만약 동일한 문자열이 존재하지 않으면 풀에 해당 값을 추가한다.

  • 따라서, intern() 메소드를 수행 뒤에 문자열은 equals()가 아닌 ==으로 동일한지 비교가 가능해진다
  • 새로운 문자열을 계속 만드는 프로그램에서 intern() 메소드를 이용하여 억지로 문자열 풀에 값을 할당하도록 하면, 저장되는 영역은 한계가 있어 그 영역에 대해 별도로 메로리를 청소하는 단계를 거친다. 
  • 즉, 작은 연산 하나를 빠르게 하기 위해 전체 자바 시스템에 악영향을 주게 된다.

StringBuffer

public final class StringBuffer extends AbstractStringBuilder implements Serializable, Comparable<StringBuffer>, CharSequence {
  • mutable 가변적
  • 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리며 유연하게 동작한다.
  • .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능
  • 초기 buffer의 크기 설정, 버퍼 크기 줄이고 늘리며 객체 생성 속도가 느리다.
  • synchronized를 지원하여 thread-safe
  • 문자열이 많고 멀티스레드 환경에서 사용

서로 같은 객체를 반환하는 StringBuffer

public static void main(String [] args){

    StringBuffer b = new StringBuffer("rose");
    
    System.out.println(b + " " + System.identityHashCode(b)); //문자열과 메모리 주소 출력
    b.append("2");
    b.append("3"); //문자열 추가
    System.out.println(b + " " + System.identityHashCode(b));
}

결과

rose 901506536
rose23 901506536

StringBulider

StringBuilder클래스는 문자열을 변경하거나 이어붙이는 경우 추가 메모리 생성 없이 기존 문자열이 확장되는 클래스

public final class StringBuilder extends AbstractStringBuilder implements Serializable, Comparable<StringBuilder>, CharSequence {
  • mutable 가변적
  • 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리며 유연하게 동작한다.
  • .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능
  • 초기 buffer의 크기 설정, 버퍼 크기 줄이고 늘리며 객체 생성 속도가 느리다.
  • thread-unsafe
  • 문자열이 많고 단일 쓰레드 환경에서 사용

서로 같은 객체를 반환하는 StringBuilder

public static void main(String [] args){

    StringBuilder c = new StringBuilder("rose");

    System.out.println(c + " " + System.identityHashCode(c)); //문자열과 메모리 주소 출력
    c.append("2");
    c.append("3"); //문자열 추가
    System.out.println(c + " " + System.identityHashCode(c));
}

결과

rose 747464370
rose23 747464370

StringBuffer, StringBuilder 

String vs StringBuffer vs StringBulider

String StringBuffer StringBulider
immutable mutable
+ append()
문자열을 더하면 새로운 string 객체가
생성되고 기존 객체는 버려진다
문자열을 더하더라도 새로운 객체를 생성하지 않는다
thread-safe 동기화(synchronized)를 지원하여
thread-safe
thread-unsafe
Serializable, CharSequence 인터페이스 구현

 

 

 

 

 

 

 

자바의 신 by 이상민

https://velog.io/@0sunset0/StringStringBuilderStringBuffer-%EC%B0%A8%EC%9D%B4-thread-safe%EB%9E%80-String%EC%9D%B4-%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4%EC%9D%B8-%EC%9D%B4%EC%9C%A0

https://da-nyee.github.io/posts/java-string-vs-stringbuffer-vs-stringbuilder/

https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java

https://velog.io/@kiiiyeon/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%8A%B8%EB%A7%81-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95

https://haenny.tistory.com/17