본문 바로가기

Java/이론

String, StringBuilder, StringBuffer

String을 많이 쓰는데 그에 대한 정보를 알아봐야겠다.

 

1) String

기본적으로 Java에서는 String 객체의 값은 변경할 수 없다.

그래서 초기공간과 다른 값에 대한 연산에서 많은 시간과 자원을 사용하게 된다는 특징이 있다.

 

※ jdk8까지는 String객체의 값은 char[] 배열로 구성되어져 있지만, jdk9부터는 기존 char[]에서 byte[]

사용으로 바뀌어 성능 및 heap 공간 효율(2byte → 1byte)을 높이도록 수정되었다.

 

다음 이미지의 예시로 String이 어떻게 메모리를 차지하는지 알아보자.

String 예시

Strimmutable 변수를 보면 정상적으로 string이 더해진 것을 볼 수 있다. 시각적으로는 immutable에서

더해진 것이지만 실제 메모리 상에서는 그렇지 않다.

 

오른쪽 그림을 보게 되면 메모리 상의 String Pool에 immutable이 생성되고 그 후 immutable string을 참조해서

가져온다. 결국 immutable값은 GC(Garbage Collector)에 의해 삭제된다. String을 통한 모든 메소드 사용을

해도 똑같은 현상이 일어난다.

 

GC의 과다한 사용으로 성능 저하 원인

 

그렇다면 왜 String을 불변으로 만들었을까

- 캐싱 : String을 불변하게 함으로써 String Pool에서 빨리 가져오겠다는 것이다.

- 보안 : 번지수의 문자열 값이 변경이 가능하다면 해커가 참조 값을 변경해 문제가 생긴다.

- 동기화 : 불변함으로써 동시에 실행되는 여러 스레드에서 안정적이게 공유가 가능하다.

 

 

2) StringBuffer / StringBuilder

StringBuffer, StringBuilder

 

StringBuffer나 StringBuilder의 경우 문자열 데이터를 다룬다는 점에서 Stringr객체와 같지만

객체의 공간이 부족해지는 경우 버퍼의 크기를 유연하게 늘려주어 가변적이라는 점이다.

오른쪽 그림을 보게되면 기존의 Stirng과 같이 새로운 객체가 생기는 것이 아니라

한 개의 객체에서 진짜로 더해주는 것이다.

 

차이점

간단히 Thread Safe이다. StringBuilder는 멀티 쓰레드를 지원하지 않고,

StringBuffer은 멀티 쓰레드를 지원한다. 단일 쓰레드에서 문자열 수정이 많아지면

StringBuilder를 하는 것이 맞다. 왜냐하면 StringBuffer의 경우는 멀티 쓰레드를 하기 위해서

추가적인 연산과 메모리를 차지하게 되므로 싱글 쓰레드라면 StringBuilder가 맞다.

 

결론

문자열을 수정할 일이 거의 없다면 String을 쓰고

싱글 쓰레드에서 문자열의 수정이 잦다면 StringBuilder

멀티 쓰레드에서 문자열의 수정이 생기면 StringBuffer다.

'Java > 이론' 카테고리의 다른 글

Javax → Jakarta  (0) 2024.06.28
제네릭(Generic)  (0) 2024.06.27
암호화  (0) 2024.06.23
Java Version(8, 11, 17)  (0) 2024.06.22
람다식(Lamda)식  (0) 2024.06.22