[JAVA] String, StringBuffer, StrtingBuilder 기초탄탄
자바에서 대표적으로 문자열을 다루는 자요형 클래스로 아래와 같이 3가지가 있다.
3가지 클래스는 문자열을 다루는데 있어 공통점이 있지만 사용목적 이나 상황에 맞는 클래스를 선택해야한다.
String vs (StringBuffer, StringBuilder) 비교
String은 불변 || StringBuffer, StringBuilder은 가변
String은 불변이라는 말을 이해 하기 위해서 String 값이 메모리에 어떤 형식으로 저장 되는지 알아야한다.
기본적으로 리터럴 방식으로 String을 선언 했을떄
String str = "hello";
str = str + " java";
System.out.println(str); // hello java
위의 예제 코드를 보았을떄 변수 str 가 참조하는 메모리의 "hello" 값에 " java" 라는 문자열을 더해서 String 자체의 값을 업데트 시킨 것 처럼 보이지만 실제로는 메모리 heap 영역 안 string constant pool 이라는 영역에서 "hello" 값을 참조 하다가 새로운값 "hello java"를 생성한 뒤 참조 하는것이다. 이렇듯 값 string의 값 자체는 변경 할 수 없어 불변이라 칭한다.
(new String("~~") 을 했을떄도 마찬가지 heap영역에 계속 새로운 객체를 생성)
String 객체의 내부 구성요소를 보면 다음과 같다.
인스턴스 생성시 생성자의 매개변수를 입력받는 문자열은 이 value 라는 인스턴스 변수에 byte배열로 저장되게 된다.
이 value 라는 변수는 상수로써(final) 값을 수정하지 못한다.
Tip
jdk 8 까지는 String 객체의 값은 char[ ] 배열로 구성되어져 있지만, jdk 9 부터 기존 char[ ]에서 byte[ ] 를 사용하여
사용하여 String Compacting을 통한 성능 및 heap 공간 효율(2byte -> 1byte)을 높이도록 수정되었다.
-메모리 관련 참고-
2024.04.11 - [분류 전체보기] - 리터럴(Literal)이 알고 싶었는데 메모리 공부까지....
리터럴(Literal)이 알고 싶었는데 메모리 공부까지....
대부분 초보자를 위한 java 관련 블로그나 기타 내용을 보면 literal에 대한 내용은 꼭 나오지만 설명이 10줄이 넘어 가는 것이 없었다. 그래서 꼭 언급할 만큼 중요는 한데 왜 내용이 빈약 하지라는
jaydenhs.tistory.com
StringBuffer / StringBuilder은 가변
StringBuffer나 StringBuilder 같은 경우 문자열 데이터를 다룬다는 점에서 String 객체와 같지만, 객체의 공간이 부족 해지는 경우 버퍼의 크기를 늘려주어 가변(mutable)적 이라는 차이가 있다.
두 클래스는 내부 Buffer(데이터를 임시로 저장하는 메모리-- 사실상 메모리 블럭이라는데... )에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 할 수 있도록 설계 되어 있다.
.append() .delete() 등의 API를 이용하여 동일 객체 내에서 문자열 크기를 변경하는 것이 가능하다.
따라서 값이 변경될 떄만다 새롭게 객체를 만드는 String 보다 훨씬 빠르기 떄문에, 문자열의 추가, 수정, 삭제가 빈번하게 발생할 경우라면 String 클래스가 아닌 StringBuffer / StringBuilder를 사용하는 것이 이상적이다.
StringBuffer 와 StringBuilder 의 super를 타고 들어가면
이처럼 value 값에 final 키워드가 없는것을 볼수 있다.
버퍼와 빌더의 가변 관련내용은 너무 많고 점점 방대해지는 느낌이 있어 여기까지 하고
종합적으로 정리해보면 아래와 같다.