본문으로 바로가기

[JAVA] StringBuffer, StringBuilder, String

category CS/개발지식 2018. 6. 7. 17:01

학습 목표

  1. String을 사용하지 않는 이유
  2. StringBuffer와 StringBuilder의 차이점을 이해하자!


String과의 차이점


① 공통점


▷ String, StringBuilder, StringBuffer 모두 문자열을 저장하고 관리하는 클래스이다.


 차이점 (String vs (StringBuffer, StringBuilder))


▶ String은 immutable(불변)하고 StringBuffer, StringBuilder는 mutable(가변)한다는 점입니다.

▷ String은 new 연산을 통해 생성되면, 그 인스턴스의 고정된 메모리 공간이 잡히게 됩니다. (즉, 할당된 메모리 공간은 변하지 않아 불변하다고 말을 합니다.)


[String을 쓰면 안되는 이유]

▷ 즉, 새로운 문자열이 만들어지면 기존의 문자열은 가비지 콜렉터에 의해 제거되야하는 단점이 있습니다.

▷ 또한, 이러한 문자열 연산이 많아질 때 계속해서 객체를 만드는 오버헤드가 발생하므로 성능이 떨어집니다. (내부적으로 char배열을 사용하기 때문에)


[String을 쓰면 좋은 경우]

▶ 문자열 연산이 적고, 조회가 많을 때, 멀티쓰레드 환경에서 사용하면 좋다. (immutable(불변) 성질 때문 멀티쓰레드 환경에서 안전합니다.)


[concat vs '+']

▷ '+' 연산을 통해 문자열을 접합하면, 컴파일러가 내부적으로 Stringbuilder로 치환하여 처리해줍니다.(치환된 이후에는 하나의 메모리 주소만을 사용하게 됩니다.) 하지만 컴파일러가 확실히 치환을 해주는지 여부는 알 수 없습니다.

▷ 'concat' 연산을 통해 문자열을 접합하면, 기존에 선언된 String 객체는 남아있으며, 새로운 new String을 만들어 접합을 해줍니다.


StringBuffer vs StringBuilder


① 공통점


▷ StringBuffer, StringBuilder는 mutable(가변)한다는 점입니다.


 차이점


StringBuffer는 멀티쓰레드 환경에서 synchronized 키워드가 가능하므로 thread-safe합니다.

▷ StringBuilder는 동기화를 고려하지 않기때문에, 싱글쓰레드 환경에서 StringBuffer에 비해 연산처리가 빠릅니다.


③ 참고


▷ 일반적으로 StringBuffer와 StringBuilder의 성능을 때졌을 때 2배의 속도차이가 있다고는 하지만 실제로는 그렇지 않습니다. 하지만 확실한 점은 String연산은 16만번이상 넘어가게 되면 10초이상 걸리면서 못 쓸정도의 성능을 보여준다는 점입니다.

'CS > 개발지식' 카테고리의 다른 글

[Mac] IntelliJ 단축키  (0) 2018.07.07
[JAVA] 인터페이스와 추상클래스 공통점, 차이점  (0) 2018.06.07
[JAVA] StringBuffer, StringBuilder, String  (0) 2018.06.07
[HTML] HTML5 과 HTML  (0) 2018.05.07

댓글을 달아 주세요