분류 | String | StringBuffer | StringBuilder |
---|---|---|---|
변경 | Immutable (불변) | Mutable (가변) | Mutable |
동기화 | Synchronized 가능 (Thread-safe) | Synchronized 불가능 |
String은 기본형(int, floa, char 등)과는 다르고, 첫 글자가 대문자로 시작하는 클래스이다.
값이 같은 String은 String Pool 내에서 String 객체를 공유
// 1.
String s1 = "Hello";
// 2.
String s2 = "Hello";
// 3.
String s3 = new String("Hello");
// 4.
String s4 = new String("Hello");
💡 먼저, s1과 s2처럼 문자열로 생성된 String 객체는 해당 문자열이 동일한 경우, 그 문자열을 공유한다. 따라서 비교연산자(==)로 참조변수 s1과 s2를 비교하게 되면, 결과가 true로 나온다.
💡 반면, s3와 s4처럼 new 연산자를 통해 String 객체를 생성하게 되면, 해당 문자열이 동일한 내용일지라도 각 객체마다 문자열이 새롭게 생성된다. 따라서 비교연산자(==)로 참조변수 s3과 s4를 비교하게 되면, 각 변수가 가리키고 있는 주소값이 다르기 때문에 결과는 false로 나온다.
→ 따라서 문자열의 경우 String이 클래스이지만, new 연산자로 생성하는 것보다 문자열 대입을 통해 생성하는 것이 좋다.
추가 그림
String 을 리터럴 값으로 할당하는 경우
String strA = "abc";
String strC = "abc";
new 키워드로 값을 할당하는 경우
String strB = new String("abc");
String strD = new String("abc");
String 객체를 한번 생성하고 나면, 그 객체의 내용은 수정할 수 없다.
→ 그런데 만약, 자주 문자열 내용을 변경하게 되면 그림과 같이 새로운 문자열이 계속 생기게 되므로 효율이 떨어진다.
→ 그래서 문자열 내용을 수정할 수 있는 클래스로 StringBuffer 클래스가 있다.
객체가 불변이면 멀티 스레드 환경에서도 값이 바뀔 위험이 없다.
String과 다르게 동작함. Stringbuilder나 StringBuffer 객체는 한번 값이 할당되더라도 한번 더 다른 값이 할당되면 할당된 공간이 변하는 특성을 가짐.
동기화 여부
synchronized
키워드를 사용synchronized
란?멀티스레드 환경에서 A 스레드와 B스레드 모두 같은 StringBuffer 클래스 객체 sb의 append() 메서드를 사용하려고 하면
StringBuilder는 동기화를 지원하지 않는 반면, 속도면에선 StringBuffer 보다 성능이 좋다.
StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있다.
3개의 성능을 비교해보면 StringBuilder > StringBuffer > String
순으로 StringBuilder가 제일 빠름