String / StringBuffer / StringBuilder 차이

UkJJang·2022년 3월 21일
0

String

특징

  • Java에서 String은 불변성을 가지는 특성이 있습니다. 즉 변하지 않는 문자열을 자주 사용하는 경우엔 성능이 우수합니다.
  • 불변성을 가지고 있기 때문에 멀티쓰레드 환경에서 안전성을 가집니다.

불변(immutable)

String str = "hello"; // 불변성을 가지고 있습니다.  

// 불변성을 가지기 때문에 변화가 일어나면 메모리에 새롭게 올라가게 되며 
// 기존에 가지고 있던 hello는 GC의 제거대상이 됩니다.
str += "world"; 

단점

  • 문자열에 대한 변경이 자주 일어나는 프로그램에서 String만 사용하게 되면 String의 특성은 "불변" 이기 때문에 좋은 성능을 내기 어렵습니다.

할당방법

// 1. 리터럴 변수를 대입하는 방식 2. new 키워드 사용하기
String strA = "abc";
String strB = new String("abc");
String strC = "abc";
String stcD = new String("abc");

System.out.println(strA==strB); // false
System.out.println(strA==strC); // true
System.out.println(strB==strD); // false
  • 결과값이 다른 이유는 String타입 값 할당 방식에 따라 저장방식이 다르기 때문입니다.
    • 리터럴 변수를 대입하는 경우
      - Heap 메모리 영역 안의 특별한 메모리 공간인 constant poll영역에 저장됩니다.
      - constant poll에 존재하는 리터럴 값을 사용하게 된다면 새롭게 리터럴 값을 만들지 않고 현재 존재하는 값을 사용하게 됩니다.
    • new 키워드를 사용한 경우
      - 일반적인 객체와 동일하게 heap 영역에 메모리 공간이 할당됩니다.
      - 같은 문자열이라도 new 키워드를 사용하면 같은 값이지만 다른 메모리 영역을 참조하게 됩니다.

StringBuffer / StringBuilder

  • 이 두개는 "가변성(Mutable)"을 가지기 때문에 append() delete() 메서드를 이용하여 동일 객체 내에서 문자열 변경하는 작업이 가능합니다. 문자열에 대한 변경이 자주 일어나는 경우에는 StringBuilder, StringBuffer를 사용하면 보다 좋은 성능을 낼 수 있습니다.
StringBuffer sb = new StringBuffer("hello"); // 가변성을 가지고 있습니다.
sb.append("world") // 가변성을 가지기 때문에 동일한 메모리 hello world로 변경됩니다.

StringBuffer / StringBuilder의 차이

  • 가장 큰 차이점은 동기화의 유무입니다.
  • StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전합니다.
  • StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer보다 좋습니다.

참고


https://velog.io/@heoseungyeon/StringBuilder%EC%99%80-StringBuffer%EB%8A%94-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EC%9E%88%EB%8A%94%EA%B0%80

profile
꾸준하게 성실하게

0개의 댓글