스트링(String), 스트링버퍼(StringBuffer), 스트링빌더(StringBuilder)는 모두 문자열을 처리하는 클래스
그러나 차이점이 있음
String
- String은 immutable(불변)
- String은 문자열을 대표하는 것으로 문자열을 조작하는 경우 유용하게 사용함
- String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않음.
- 연산자, concat메서드를 통해 다른 문자열 을 붙여도 기존의 문자열에 새로운 문자열을 붙이는것이 아닌 새로 String을 만든 후 새 String객체에 연결된 문자열을 저장하고, 그 객체를 참조하게 함 ->문자열 연산이 많은 경우 성능이 좋지 않음
- Immutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기때문에(Thread-safe), 내부 데이터를 자유롭게 공유 가능
String Buffer, StringBuilder
- 기존의 버퍼 크기를 늘리며 유연하게 동작합니다.
- StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.
- StringBuilder는 동기화를 보장하지 않음.
- 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하는게 좋음
- 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋음
정리
- String은 짧은 문자열을 더할 경우 사용
- StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.
- StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다.
단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String 입니다.
@Test
void StringTest(){
// String
String str = "Hello";
String new_str = str.concat(" World"); // 새로운 문자열 객체를 만들어서 반환합니다.
System.out.println(str); // Hello
System.out.println( new_str ); //Hello World
// StringBuffer
StringBuffer buffer = new StringBuffer("Hello");
buffer.append(" World"); // 기존 객체의 값을 변경합니다.
System.out.println(buffer); // Hello World
// StringBuilder
StringBuilder builder = new StringBuilder("Hello");
builder.append(" World"); // 기존 객체의 값을 변경합니다.
System.out.println(builder); // Hello World
}
@Test
public void stringBuffer(){
StringBuffer stringBuffer = new StringBuffer("stringBuffer");
addStringBuffer(stringBuffer);
System.out.println(stringBuffer); // stringBuffer^^
}
private void addStringBuffer(StringBuffer stringBuffer){
stringBuffer.append(" ^^");
System.out.println(stringBuffer); // stringBuffer^^
}
/*
stringBuffer 가변이다.
를 매개변수로 전달 할때, 참조 타입 변수는 실제로 객체의 주소를 가리키는 값이 전달 되기 때문에
addStringBuffer()에서 값을 변경하면
동일한 객체를 참조하고 있는 변경 내용이 변경됨
*/
@Test
public void string(){
String str = "String";
addString(str);
System.out.println(str); //String
}
private void addString(String str){
str += "^^";
System.out.println(str); //String^^
}
/*
String은 불변이기 때문에 문자열 연결등의 작업이 수행 될때마다
새로운 String객체가 생성된다.
*/
'Dev > Java' 카테고리의 다른 글
Java에서 System.arraycopy를 사용하여 배열 복사하기 (0) | 2023.08.07 |
---|---|
크기가 [n][n]인 2차원 배열 가장자리부터 1,2,3,4,......로채우기 (0) | 2023.08.06 |
POJO 정리 (0) | 2023.02.15 |
AOP 개인 저장용 (0) | 2022.12.28 |
Java reflection Sample Code (0) | 2022.12.16 |