String은 불변 (immutable) 자료형이다!
String
은 변경 불가능한 문자열 객체를 생성하며, 한번 문자열이 생성된 이후 이가 할당된 공간은 절대 변하지 않는다!
이를 보면 String
문자열이 Value
라는 인스턴스 문자에 문자형 배열로 저장되어 있는 걸 볼 수 있는데 이는 상수형으로 저장돼 있어 값이 불변한 것이다.
String str = "AND SOPT";
str = str + "Server";
System.out.println(str); // AND SOPT Server
이와 같이 문자열이 업데이트 되는 상황은 뭔데?! 싶을 수 있을 것 같다.
앞선 코드에서는 AND SOPT
라는 문자열과 AND SOPT Server
의 메모리가 할당된 영역이 다르다.
즉, AND SOPT Server
이라는 저장 영역을 새로 생성하고, 기존 AND SOPT
의 참조 영역을 그대로 참조하는 것!
그러나 ...
문자열이 업데이트 될 때마다 새로운 객체를 생성하는 작업은 다른 작업에 비해 많은 시간이 소요된다. 또한, 여러 문자열을 연결해 많은 업데이트가 이루어진다면 중간 문자열 객체가 너무 많이 생성돼 코드의 비효율성
이 높아진다.
이러한 한계점을 극복하기 위해 나타난 것이
StringBuilder
과 StringBuffer
이다!
StringBuilder
과 StringBuffer
은 변경 가능한 문자열 객체 생성하며, 버퍼 크기의 확장에 유연하게 대응한다.
기존 문자열의 삭제, 추가 등 변경에 메모리를 유연하게 할당하므로 String
에서의 반복적인 객체 생성으로 인한 비효율을 줄일 수 있다.
StringBuilder과 StringBuffer은 상수(final) 키워드가 존재하지 않는다.
StringBuilder
의 사용 예시 public class Main {
public static void main(String[] args){
StringBuilder strBuilder = new StringBuilder;
strBuilder.append("SOPT");
strBuilder.append("Server");
String sql = strBuilder.toString();
}
}
append
메서드를 사용해 문자열을 연결해 주며 SQL문이나 HTML 코드를 생성하는 등의 작업에서 성능을 크게 높일 수 있다.
StringBuffer
의 사용 예시 public class Main {
public static void main(String[] args){
StringBuffer strBuffer = new StringBuffer;
StringBuffer.append("SOPT");
StringBuffer.append("Server");
String sql = strBuffer.toString();
}
}
append
메서드를 사용해 문자열을 연결해 주며 SQL문이나 HTML 코드를 생성하는 등의 작업에서 성능을 크게 높일 수 있다.
앞선 설명과 같이 문자열 연산으로 인해 기존 객체의 공간이 부족하게 될 경우 두 클래스는 버퍼 크기를 확장하며 유연하게 동작하는데, 동기화 여부
에서 각 클래스는 차이점을 지닌다.
StringBuffer
은 각 메서드 별로 Synchronized Keyword
가 존재해 멀티스레드 환경에서도 동기화를 지원하는 반면에 StringBuilder
은 동기화를 보장하지 않는다.
따라서, 멀티 스레드 환경
에서는 값 동기화 보장을 위해 StringBuffer
을 사용하는 게 유리하고, 단일 스레드 환경
에서는 StringBuilder
을 사용하는 게 성능상 유리하다.
String
은 짧고 간단한 문자열 연산에서 사용할 수 있다StringBuilder
과 StringBuffer
은 값 변경 시 새로운 객체를 만드는 String
보다 훨씬 빠르기 때문에 문자열 연산이 빈번할 때 사용하기에 유리하다.StringBuilder
은 단일 스레드 환경
에서 문자열 연산을 수행할 때 유리하다.StringBuffer
은 멀티 스레드 환경
에서 문자열 연산을 수행할 때 유리하다. 상황에 따라 알맞은 클래스를 사용해 봅시다아