String 클래스는 불변(immutable) 객체를 생성한다.
즉 한 번 생성 되면 그 내용을 변경 하지 못하기 때문에 우리가 + 연산자로 문자열을 합칠 때마다 새로운 String 객체가 생성된다는 의미이다.
String str = "EASY";
str +="HARD";
기존의 EASY를 저장한 str 객체에 HARD를 합한 것처럼 보인다.
하지만 위와 같이 str이 "EASYHARD"라는 값을 가지고 있는 새로운 메모리 영역을 가리키도록 변경되므로, str에게 버려진 기존의 "EASY"는 쓰레기(Garbage)가 돼버리고 환경미화원(Garbage Collection)이 오면 처리된다.
즉, 문자열 연결, 추가, 삭제 등의 연산이 빈번하게 발생한다면 힙 메모리에 많은 쓰레기들이 생성되어 비효율적이다. (GC 올 때까지 비효율 덩어리)
이러한 String의 비효율을 해결하기 위해 Java는 StringBuilder/StringBuffer라는 쌍둥이를 데려왔다.
StringBuilder/StringBuffer는 가변(mutable) 객체를 생성하여 문자열을 합칠 때 새로운 문자열이 아닌 동일 객체 내에서 문자열을 변경하므로 문자열 연산이 빈번하게 일어날 때 효율적으로 프로그램을 작성할 수 있다.
그렇다면 StringBuilder와 StringBuffer의 차이는 무엇일까?
가장 큰 차이점은 동기화의 유무이다.
StringBuffer는 동기화(synchronized)를 지원하여 멀티쓰레드 환경에서 안전하다.
String도 마찬가지로 멀티쓰레드 환경에서의 안정성(thread-safe)을 가지고 있다.
StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서는 적합하지 않지만, 단일쓰레드에서의 성능은 StringBuffer보다 뛰어나다.
우선 스레드와 개념을 설명하기 위한 용어들을 훑고 지나가자.
1) 프로세스(Process)
운영체제에서 실행 중인 하나의 프로그램
사용자가 프로그램을 실행하면 운영체제로부터 필요한 메모리를 할당 받고 코드를 실행 -> 프로세스
라고 부름
프로그램을 수행하는 데 필요한 데이터, 메모리 자원과 쓰레드로 구성되어 있으며, 프로세스의 자원을 이용해 실제로 작업을 수행하는 것이 쓰레드이다.
즉, 프로세스에 자원을 할당해주는 건 운영체제이고 프로세스에 할당된 자원을 가지고 작업을 수행하는 건 스레드이다.
2) 스레드(thread)
멀티스레드 프로세스
라고 한다3) 멀티 태스킹(multi-tasking)
동시에 2가지 이상의 작업을 처리하는 것
운영체제는 멀티태스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당하고 병렬로 실행한다.
ex) 유튜브로 음악 듣기 + 백준 알고리즘 문제 풀기
4) 멀티 스레딩(multi-threading)
멀티 프로세스는 운영체제에서 할당 받은 자신의 메모리를 가지고 실행하기 때문에 독립적이므로 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영향을 미치지 않는다.
멀티 스레드는 하나의 프로세스 내부에서 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에 영향을 미친다.
즉, 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하며 작업하므로 발생할 수 있는 동기화(synchronization), 교착상태(deadlock) 같은 문제를 고려해야한다.
멀티스레드 환경에서 쓰레드 A가 작업하던 공유 데이터를 쓰레드 B가 임의로 변경하였다면, 다시 쓰레드 A가 제어권을 받아서 나머지 작업을 마쳤을 때 원래 의도와 다른 결과를 얻을 수 있다.
이러한 일이 발생하는 것을 방지하기 위해 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 해야한다.
이를 방지하기 위해 도입된 개념이 '임계영역(critical section)' 과 '잠금(lock)'이다.
공유 데이터를 사용하는 코드 영역을 임계영역으로 지정해놓고, 공유 데이터가 가지고 있는 lock을 획득한 하나의 쓰레드만이 이 영역 내의 코드를 수행한다.
이처럼 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 '쓰레드 동기화(synchronization)'라고 한다.
Why Use StringBuffer and StringBuilder in Java
String, StringBuffer, StringBuilder 차이, 장단점
[JAVA]멀티 스레드
자바-Synchronized 스레드