원래는 Python으로 알고리즘 공부를 했었는데,
최근에 Java로 풀어보고 있다.
그런데 String이 자꾸 헷갈려서 ㅠㅠ
Java에서 문자열을 저장하고 관리하는 클래스들을 정리해보려고 한다.
immutable. 즉 불변하는 성질이 있다.
객체를 생성했을 때 그 객체의 메모리 공간은 불변한다.
예를 들어 string객체를 생성한 후 그 객체에 대해 연산을 수행하면(+, split, concat 등의 문자열 연산)
그 객체 자체가 변하는 게 아니라 새로운 메모리 공간에 새 string 객체를 만들게 생성한다.
당연히 문자열 연산이 많아질수록 계속해서 객체를 만드는 오버헤드가 존재하고, 기존의 문자열은 Garbage Collection에 의해 제거되기 때문에 성능면에서 우웩..
하지만 불변하는 성질때문에 멀티 스레드 환경에서 자원(데이터) 공유 시 동기화를 신경 쓸 필요가 없고 안정성이 유지된다.
[Thread-safe]
String 클래스는 비교적 문자열에 대한 연산이 적고 조회가 많을 때 멀티 스레드 환경에 적합하다.
두 클래스 모두 String과는 다르게 mutable.
즉, 가변객체이며
AbstractStringBuilder를 상속받는다.
가변 크기 배열을 이용해서 필요한 경우에만 문자열을 복사한다.
새로운 문자열이 들어갈 수 있는 공간이 있다면 그대로 삽입하고,
공간이 부족할 때는 배열 크기를 두배로 증가시켜 기존의 문자열을 복사하고 새로운 문자열을 삽입한다.
StringBuffer는 멀티 스레드에 안전(Thread-safe)하도록 동기화 되어 있다.
멀티 스레드로 작성된 프로그램이 아닌 경우,
StringBuffer의 동기화는 불필요하게 성능을 떨어뜨리게 된다.
그래서 StringBuffer에서 쓰레드 동기화를 뺀 StringBuilder가 등장하는 맥락
따라서 StringBuilder는 멀티 스레드 환경에 적합하지는 않지만 동기화를 신경쓰지 않아 싱글 스레드 환경에서 연산처리가 빠르다.
StringBuilder는 StringBuffer와 완전히 똑같은 기능으로 작성되어 있어서 소스코드에서 StringBuffer대신에 StringBuilder로 바꾸기만 하면 된다.
✅ StringBuffer는 동기화, Thread-safe, 성능 ㅠㅠ
✅ StringBuilder는 동기화X, 성능향상 !!