해당 페이지에서는 String과 StringBuffer, StringBuilder에 대해서 이해하고 각각의 차이점과 언제 사용해야 하는지에 대해 이해하기 위한 글입니다.
1) String, StringBuffer, StringBuilder
💡 String이란?
- Java에서 String은 불변(immutable)한 문자열을 처리하기 위한 클래스입니다. 즉, String 객체가 생성되면 그 값은 변경되지 않습니다. “새로운 객체”로 추가 및 변경이 됩니다.
💡 StringBuffer란?
- Java에서 StringBuffer는 가변(mutable)한 문자열을 처리하기 위한 클래스입니다. 즉, 새로운 문자열을 추가하거나 변경하게 되면 “기존의 객체”로 추가 및 변경이 됩니다. 💡StringBuidler란? - Java에서 StringBuilder는 가변(mutable)한 문자열을 처리하기 위한 클래스입니다. - StringBuffer와 마찬가지로 새로운 문자열을 추가하거나 변경하게 되면 “기존의 객체”로 추가 및 변경이 됩니다. - StringBuffer와 다르게 멀티쓰레드 환경에서 안정적이지 않으며, StringBuilder는 싱글쓰레드 환경에서 StringBuffer보다 더 빠른 성능을 가집니다.
[ 더 알아보기 ]
💡 불변(immutable)한 클래스
- 최초 객체를 생성 한 뒤 상태를 변경 할 수 없는 것을 의미합니다. 최초 생성한 객체에 추가나 변경이 발생하는 경우 새로운 객체가 다시 생성이 되어 구성됩니다. - Java에서는 String, Integer, Float, Double, Long, Short, Byte, Character, BigDecimal, BigInteger 등의 클래스가 불변 클래스에 속합니다.
💡 가변(mutable)한 클래스
- 최초 객체를 생성 한 뒤 상태를 변경 할 수 있는 것을 의미합니다. 최초 생성한 객체에 추가나 변경이 발생하는 경우 “기존의 객체”에 상태가 변경되어 구성됩니다. - Java에는 StringBuffer, StringBuilder, ArrayList, LinkedList, HashMap, HashSet, TreeMap, TreeSet 등의 클래스가 가변 클래스에 속합니다.
💡 싱글쓰레드(Single Thread)
- 하나의 코드 블록을 실행하는 동안 다른 코드 블록이 실행되지 않는 경우입니다. 즉, 동시에 하나의 작업만 실행할 수 있습니다.
💡 멀티쓰레드(Multi Thread)
- 두 개 이상의 쓰레드가 동시에 실행되는 것을 말합니다. 여러 개의 코드 블록이 동시에 실행될 수 있으므로, 멀티쓰레드 환경에서는 동기화(synchronization) 문제가 발생할 수 있으며, 이를 해결하기 위해 락(lock)과 언락(unlock) 메커니즘이 사용됩니다.
2) String, StringBuffer, StringBuilder 차이점
차이점
String
StringBuffer
StringBuilder
선언 방식
String str = "Hello";
StringBuffer sb = new StringBuffer("Hello");
StringBuilder sb = new StringBuilder("Hello");
문자열 변경 방법
str += " World";
sb.append(" World");
sb.append(" World");
클래스 종류
불변(immutable)한 클래스
가변(mutable)한 클래스
가변(mutable)한 클래스
변수의 추가 및 변경 시 메모리 성능
불리함
유리함
유리함
단일 쓰레드 환경에서 성능
안정적
안정적
안정적
멀티 쓰레드 환경에서 성능
안정적
안정적, 동기화 과정에서 성능 저하
안정적, 동기화 과정에서 성능 저하 X
속도
매우 느림
빠름
빠름
사용목적
문자열 추가와 변경이 발생하지 않는 경우 사용하는 것이 좋다.
멀티쓰레드 환경에서 문자열의 변수의 추가와 변경이 자주 발생하는 경우 사용하면 좋다.
단일쓰레드 환경에서 문자열의 변수의 추가와 변경이 자주 발생하는 경우 사용하면 좋다.
💡 String을 이용한 객체의 추가 방법
String s = "Hello";
s += " World"; // String 객체가 재 생성된다.
💡 StringBuffer를 이용한 문자열 변경 방법
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 기존의 StringBuffer 객체에 추가가 된다.
💡 StringBuilder를 이용한 문자열 변경 방법
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 기존의 StringBuilder 객체에 추가가 된다.
3) String to StringBuffer, StringBuilder / StringBuffer, StringBuilder to String