2024.03.07 - string, StringBuilder
- string
string은 문자들의 순차적 집합으로 표현된다. 내부적으로 문자 배열을 통해서 구현된다.
string의 각 문자를 인덱스를 통해 읽을 수 있으면, 수정하는 것도 가능할 것 같지만, 그건 불가능하다.
- string이 데이터를 저장하는 방식
위와 같은 코드가 있다. string의 값이 변경될 경우 데이터 영역에서는 다음과 같은 일이 일어난다.
string str = "test";를 수행하면, stack에 변수 str의 메모리 공간이 할당되고, heap에 생성된 문자열 "test"를 담은 메모리의 주소값을 참조한다.
str = "테스트";를 수행하면 heap공간의 문자열 "test"를 "테스트"로 바꿔주는 것이 아니라, "테스트"를 담는 heap의 새로운 메모리 영역을 만들고, str는 그 새로운 메모리 주소를 참조한다. heap에 남겨진 test는 가비지 컬렉터에 의해 소멸한다.
string 연산을 하더라도 heap에 새로운 메모리 영역을 만들어서 저장한다. string 타입의 데이터를 자주 변경하면 가비지 컬렉터를 자주 불러내므로 프로그램 속도가 저하된다.
- StringBuilder
StringBuilder도 string처럼 문자열을 나타내는데 사용하는 클래스이다.
StringBuilder는 string과 달리 참조 값이 변경되면, 새로운 메모리를 만들지 않고 기존 메모리의 값을 변경한다.
StringBuilder의 객체 생성 및 초기화 방법은 아래와 같다.
StringBuilder 객체명 = new StringBuilder();
StringBuilder 객체명 = new StringBuilder("초기화용 문자열");
- StringBuilder가 데이터를 저장하는 방식
위와 같은 코드가 있다. StringBuilder의 값이 변경될 경우 메모리 영역에서는 다음과 같은 일이 일어난다.
heap에 "asdf"를, stack에 그 참조를 저장하는 것은 string과 동일하다.
AppendLine()은 StringBuilder에 문자열을 더해주는 메서드이다. StringBuilder의 값이 변경되면 string과 달리 기존 heap 메모리 영역의 값을 바꿔준다. 남겨진 메모리 영역이 없기 때문에 가비지 컬렉터가 일할 필요가 없다.
- string VS StringBuilder
각각의 값의 변경이 자주 일어날 경우 처리속도를 비교해보자.
string타입과 StringBuilder타입의 데이터를 각각 20만번 변경해주고, 그 시간을 재었다.
유의미한 차이가 있음을 확인할 수 있다. 값의 변경이 자주 일어나는 경우는 문자열을 표현할 때 StringBuilder를 사용하는 것이 좋을 것이다.