String
String의 특징 중 하나는 불변성(immutable)을 갖는다는 점.
문자열 추가,수정,삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 됨. (공간복잡도)
String name = new String("우코");
name += " 학생";
/*
"우코 학생" 이라는 출력물이 나올 것이다.
그러나 이를 위해 String은 "우코"이라는 데이터를 갖는 name을 두 번 생성해서 "우코 학생"이라는 데이터를 만들고 기존의 name = "우코"을 지우는 것이다. 즉 name이 쓸데없이 2번이나 생성됐다.
지금같이 간단한 코드는 상관없지만 기업의 대규모 프로그램에서 하루에 셀수도 없이 많은 String이 생겼다가 없어진다면
공간복잡도, 시간복잡도 측면에서 굉장히 비효율적인 프로그램이 될 것이다. 이를 해결하기 위해 "StringBuffer/StringBuilder"를 이용한다
*/
하지만, immutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기때문에(Thread-safe), 내부 데이터를 자유롭게 공유 가능.
String 저장 예시
String str1 = "Arsenal";
String str2 = "Arsenal";
String str3 = "FC Seoul";
String str4 = new String("Arsenal");
/*
생성된 String 객체는 Stack 영역에 저장되고,
Heap 영역에는 "Arsenal", "FC Seoul"과 같은 data들이 들어가게 되는데,
str4는 str1, str2와 같은 데이터("Arsenal")를 저장했지만 주소값이 다른 것을 볼 수 있다.
이를 통해 String literal로 생성하면 해당 String 값은
Heap 영역 내 "String Constant Pool"에 저장되고,
new 연산자로 생성하면 Heap영역에 저장되는 것을 알 수 있다.
*/
공통점
가변성(mutable)
차이점
동기화의 유무
StringBuffer는 동기화 키워드를 지원해서 멀티-스레드(Multi-Thread) 환경에서 안전.
StringBuilder는 동기화를 지원하지 않기 때문에 멀티-스레드(Multi-Thread) 환경에서 적합하지 않지만, 싱글-스레드(Single-Thread) 환경에서는 StringBuffer보다 빠른 성능을 보장.
문자열을 자유롭게 수정, 삭제할 수 있는 StringBuffer와 StringBuilder의 특징 잘 알고가요!
다음에도 도움이 될 만한 자바 관련 글 기대하겠습니다. 🐤🐣