
내일배움캠프 13일차 TIL : Java - String, StringBuffer, StringBuilder
다시 돌아와서 Java다 음,,, 오늘 배운 내용중에 reference에 관련된 내용인데 예시로 String에 관련된 부분도 있었고, 오늘 푼 문제도 문자열 관련된 문제를 풀었으니까 겸사겸사 정리하는 겸 다뤄보겠다.
그냥 String도 아니고 Builder는 뭐고 Buffer는 또 뭘까
StringBuilder & StringBuffer 는 문자열을 추가 또는 변경하는 등 연산에 사용되는 클래스다.
문자열을 추가하는 건 "연산자 +" 만 사용해도 가능하지 않나?
'+' 아니면 concat쓰면 되잖아?
라고 생각할 수 있지만 String 인스턴스의 문자열을 결합하는 경우에는 내용이 변경된 새로운 String 인스턴스를 생성하게 되는 것이다.
따라서 문자열을 여러번 연산하게 된다면 메모리 누수나 속도 저하 같은 사이드 이펙트가 발생한다.
이러한 점을 해결하기 위해 자바는 문자열 연산을 전용으로 하는 자료형을 제공한다.
StringBuffer 클래스는 내부적으로 버퍼 Buffer라는 독립적인 공간을 가지고 있다.
이러한 이유 때문에 문자열을 연산할 때 새로운 인스턴스가 생기는 등 공간의 낭비가 없으며 속도가 빠르다.
StringBuffer는 기본적으로 16개의 문자를 저장할 수 있는 크기로 생성되며
생성자를 통해 크기를 지정할 수 있다.
물론 동적으로 버퍼의 크기가 커지긴 하지만 효율성 면이 떨어질 가능성이 높다.
StringBuilder는 가볍게 정리하고 넘기겠다.
일단 하는 역할과 특성 제공되는 메서드나 메서드의 사용법 모두StringBuffer와 똑같다.
그럼 무슨 차이일까?
멀티 쓰레드(Thread)에서 안전(safe)하냐 아니냐 이 차이 뿐이다.
사실 저건 문제 풀이 때문에 적은 거고
String을 조금 더 자세히 봐야하는 시점이기 때문에 위의 내용은 간략하게 적었다.
일단 결론을 말하자면 String은 불변 immutable 한 특성을 가지고 있다.
기본적으로 자바에서는 String 객체의 값은 변경할 수 없다.
한 번 할당된 공간이 변하지 않는 특성을 불변 immutable 자료형이라고 부르는데 해당 자료형을 연산한다면 초기 공간과 다른 값에 대한 연산에서 많은 시간과 자원을 사용하게 된다.
실제로 String 객체 내부를 보면 final형으로 저장되는 걸 찾아볼 수 있다.
final로 저장된 변수지만 연산을 통해 출력해보면 값이 바뀌기는 한다.
String str = "자바";
str = str + " 너무 어렵다.";
System.out.println(str); // 자바 너무 어렵다.
그럼 어떻게 값이 바뀌는 건지 알아보면 메모리 상에서 새로 연산된 값("자바 너무 어렵다.")에 대한 공간을 생성하고 해당 공간을 다시 참조하는 방식으로 문자열이 변경되는 것 처럼 보인다.
보안: 불변한 문자열은 보안 측면에서 유리하다.
불변한 문자열은 변경되지 않으므로 암호화된 데이터가 노출되지 않는다.스레드 안전성: 불변한 문자열은 스레드 안전성을 제공한다.
여러 스레드가 동시에 문자열을 수정하려고 할 때 문제가 발생하지 않는다.문자열 풀 (String Pool): 불변한 문자열은 문자열 풀에 저장된다.
문자열 풀은 동일한 내용의 문자열을 공유하여 메모리를 절약한다.
(예를 들어, "Hello"라는 문자열을 여러 번 생성하면 실제로는 하나의 인스턴스만 유지된다.)성능 최적화: 불변한 문자열은 연산 시에 캐싱되므로 성능이 향상된다.
문자열 연결, 비교, 해시 등의 작업에서 불변성은 유용하게 사용된다.문자열 리터럴: 자바에서 문자열 리터럴은 불변한 문자열로 처리된다.
따라서 "Hello"와 같은 문자열 리터럴은 항상 같은 인스턴스를 참조한다.
후기 : 뭔가 내용이 부실한데....
강의 자료 올라오면 다시 보고 참고해서 보충하고 복습해야겠다.