Java에는 문자열을 다루는 class로
String, StringBuffer, StringBuilder 가 있다.
각각은 모두 조금씩 차이가 있다.
immutable (불변) vs mutable (가변)
String 객체는 한번 선언되면 할당된 공간이 변하지 않지만
StringBuffer나 StringBuilder의 경우 공간이 부족해지면 버퍼의 크기를 유동적으로 늘려준다 .
그래서 String은 대입해야 해당 변수의 값이 변한다.
StringBuffer는 멀티쓰레드환경에서 synchronized키워드가 가능하므로 동기화가 가능하다. 즉, thread-safe하다.
반대로 StringBuilder는 동기화를 지원하지 않기 때문에 멀티 쓰레드 환경에서는 적합하지 않다. 즉, thread-safe하지 않다.
대신 StringBuilder가 동기화를 고려하지 않기 때문에 싱글쓰레드 환경에서 StringBuffer에 비해 연산처리가 빠른 장점이 있다.
이 두가지는 모두 String 보다 문자열 연산을 할 때 아주 효과적이라는 특징이 있다.
동기화를 고려하는 환경에서는 StringBuilder가 성능이 더 좋고,
동기화가 필요한 멀티쓰레드 환경에서는 StrignBuffer를 사용하는 것이 더 유리하다.
String a = "abc" ;
String b = "abc"; -> String pool 에 있는 하나의 값 "abc" (기본타입)
String c = new String ("abc"); -> 새로운 객체를 만들어낸 "abc" (참조타입)
1. 주소값을 비교하는 == 연산
System.out.println(a ==b) // true
System.out.println(a ==c) // false
2. 값을 비교하는 .equals()
System.out.println(a.equals(b)) // true
System.out.println(a.equals(c)) // true
즉 기본타입 ≠ 참조타입
참고: https://jeong-pro.tistory.com/85 [기본기를 쌓는 정아마추어 코딩블로그]