String, StringBuffer, StringBuilder
String
문자열을 저장하는 String은 내부의 문자열을 수정할 수 없다.
예를 들어 String의 reaply() 메소드는 내부의 문자를 대치하는 것이 아니라
대치된 새로운 문자열을 리턴한다 String 객체를 + 연산할 경우에도 마찬가지
String data = "ABC";
data += "DEF";
"ABC"에 "DEF"가 추가되었기 때문에 한 개의 String 객체가 사용되었다고 생각할 수 있지만
String 객체는 내부 데이터를 수정할수 없으므로 "ABC"에 "DEF"가 추가된 "ABCDEF"라는
새로운 String 객체가 생성된다
그리고 변수 data는 새로 생성된 String 객체를 참조하게 된다.
문자열을 결합하는 + 연산자가 많이 사용하면 할수록 그만큼 String 객체의 수가 늘어나기 때문에
프로그램 성능을 느리게 하는 요인이 된다.
따라서 문자열을 변경하는 작업이 많을 경우 StringBuffer 또는 StringBuilder 클래스를
사용하는 것이 좋다.
StringBuilderクラス
StringBuilder 클래스는 내부적으로 문자열을 저장하기 위한 메모리 공간을 지닌다
이 메모리 공간은 String 클래스의 메모리 공간과 달리 문자를 추가하거나 삭제하는 것이 가능하다.
따라서 수정하면서 유지해야 할 문자열이 있다면 이 클래스에 그 내용을 담아서 관리하는것이 효율적
StringBuilder 인스턴스는 메모리 공간을 스스로 관리한다
즉 부족하면 그 공간을 늘린다 그러나 이는 소모가 많은 작업이다. 따라서 사용 계획에 따라서
적절한 크기를 초기에 만들면 그만큼의 성능 향상을 기대할 수 있다.
StringBuilder의 생성자
public StringBuilder()
-> 16개의 문자를 저장할 수 있는 메모리 공간 확보
public StringBuilder(int capacity)
-> capacity개의 문자를 저장할 수 있는 메모리 공간 확보
public StringBUilder(String str)
-> 전달되는 문자열과 16개의 문자를 저장할 수 있는 메모리 공간 확보
StringBuffer StringBuilderの異同
이 두 클래스는 내부 버퍼(데이터를 임시로 저장하는 메모리)에 문자열을 저장해두고
그 안에서 추가, 수정, 삭제 할 수 있도록 되어있다.
String처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있는것이다.
둘의 사용 방법 기능은 동일한데 가장 큰 차이점은 동기화의 유무로써
'StringBuffer'는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점
'StringBuilder'는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서
사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은
'StringBuilder'가 뛰어나다.
整理する
공통점 (사실상 같은 클래스)
1. 생성자를 포함한 메소드의 수
2. 메소드의 기능
3. 메소드의 이름과 매개변수의 선언
차이점
StringBuilder : 멀티 쓰레드에 안전하지 않지만 속도가 빠르다.
StringBuffer : 쓰레드에 안전하지만 멀티 쓰레드에 안전하게 설계된
StringBuffer 클래스는 속도가 느리다
Reference
この問題について(String, StringBuffer, StringBuilder), 我々は、より多くの情報をここで見つけました https://velog.io/@gustjtmd/String-StringBuffer-StringBuilderテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol