[Java] String, StringBuffer, StringBuilder 차이 및 장단점

김영훈·2022년 4월 10일
0

JAVA

목록 보기
1/1

Java에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있다.

연산이 많이 않을때는 특별한 이슈가 발생할 가능성이 거의 없지만, 연산횟수가 많아지거나 멀티스레드, 경쟁 상태(Race Condition) 등의 상황이 자주 발생하면 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해야 한다.

StringStringBufferStringBuilder의 기본적인 차이는 String은 불변(Immutable), StringBufferStringBuilder는 변함(Mutable) 이다.

1. String

string 객체는 한번 생성됨면 할당된 메모리 공간이 변하지 않는다.

concat 메서드 또는 + 연산자를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라 새로운 String 객체를 만든 후 새 String 객체에 연결된 문자열을 저장하고 그 객체를 참조하도록 하는 것이다.

즉, String 클래스 객체는 Heap 메모리 영역에 생성하고 한번 생성된 객체 내부 내용을 변화시킬 수 없다.

String 객체는 문자열 연산이 많은 경우 성능이 좋지 않다

String str = "Hello"; // 메모리에 Hello 담는다.

str = str.concat(" World"); //기존 메로리 Hello에 값을 붙이는 것이 아니라 새로운 메모리에 Hello World를 담는다.

2. StringBuffer와 StringBuilder

StringBuffer와 StringBuilder는 String과 다르게 동작한다.

문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리면 유연하게 동작한다. StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일하다.

차이점

StringBufferStringBuilder
동기화동기화 보장 o동기화 보장 x
  • 멀티스레드 환경이라면 값의 동기화 보장을 위해 StringBuffer를 사용하는 것이 좋다.
  • 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다.
    • StringBuffer는 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다
StringBuilder sb = new StringBuilder();
sb.append("Hello"); // 기존 메모리를 늘려 Hello 추가
sb.append(" ").append("world") // 기존 메모리를 늘려 " "와 "world" 추가

3. 정리

보통 사용할 떄 String을 사용하고,

출력값이 많아지거나 String에서 + 연산자나 , concat() 메서드 사용이 많아진다면 StringBuilder를 사용하자!

profile
배우는 개발자가 되고 싶습니다.

0개의 댓글