2021-03-15 TIL(at work)

업데이트:
1 분 소요

Java

  • 이전에 학습을 하면서는 String, StringBuilder, StringBuffer를 구분해서 사용한 경험이 없었다. 그런데 회사에서 새로 맡은 업무를 위해 소스 코드를 보던 중 StringBuilder를 사용한 코드를 보게 되었고, 굳이 왜 StringBuilder를 사용했는지 궁금했다. 궁금증을 해결하기 위해 String, StringBuilder, StringBuffer에 대해 조금 더 알아보았다.
  • Java에서 String, StringBuilder, StringBuffer는 모두 문자열을 표현하기 위한 자료형이다. 그렇지만 셋의 차이점이 있다.

1. String

  • String은 변하지 않는 속성을 갖는다.
  • String 클래스의 참조변수에 새 문자열을 선언한다. 그리고 새로운 문자열을 더해본다. 이 경우 새로운 참조변수가 가르키던 문자열에 다른 문자열이 더해지는 것이 아니라, 새로운 메모리 영역을 할당 받은 새로운 문자열(String) 인스턴스가 생성된다.
  • 예를 들어, 참조변수 string에 다른 문자열을 더해 새로운 문자열을 만들었다면, "Hello, "는 가비지가 되고, "Hello, World!"라는 문자열 객체가 생성된다.
String string = "Hello,"; // String string = new String("Hello, ");
string = string + " World!"; // [Hello, World!]
  • 이와 같이 String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우에 사용하기 적절하다. 문자열을 계속해서 수정하고 삭제하는 경우가 빈번하게 발생하는 경우에는 String 클래스를 사용하게 되면 Heap 메모리에 많은 가비지가 생성되어 메모리가 부족해질 수도 있다.

2. StringBuilder & StringBuffer

StringBuilder와 StringBuffer의 공통점

  • StringBuilder와 StringBuffer는 가변성을 가지고 있다. StringBuilder나 StringBuffer 클래스의 참조변수가 가리키는 문자열이 변경되더라도, 새로 인스턴스를 생성하지 않고 동일한 객체 내에서 문자열이 변경된다. 따라서 문자열을 빈번하게 수정하고 삭제하는 등의 연산이 필요한 경우에는 StringBuilder나 StringBuffer를 사용하는 것이 좋다.
StringBuilder sb = new StringBuilder("Hello, ");
sb = sb + " World!"; // [Hello, World!]

StringBuilder와 StringBuffer의 차이

  • StringBuilder와 StringBuffer는 동일한 API를 가지지만, 가장 큰 차이점은 동기화의 유무이다.
  • StringBuilder와 동기화를 지원하지 않아 멀티 쓰레드 환경에서 안전하지 않다. StringBuffer의 경우 동기화를 지원하여 멀티 쓰레드 환경에서 안전하다.
  • 따라서 가변성 있는 문자열을 사용하고자 할 때, 멀티 쓰레드 환경에서는 StringBuffer를 사용하는 것이 적절하고 단일 쓰레드 환경에서는 StringBuilder를 사용하는 것이 적절하다.

태그:

카테고리:

업데이트: