Tom's Note
반응형

개요

 

이 포스트는 JAVA에서 사용하는 문자열 클래스를 포스팅합니다. 

  • java.lang.String
  • java.lang.StrringBuffer
  • java.lang.StringBuilder

위 클래스들의 차이점을 알아보고 언제 사용하는지에 대해 알아보겠습니다.

 

1. 문자열

2. String VS StringBuffer, StringBuilder

3. StringBuffer VS StringBuilder

4. 정리

 


1. 문자열

 

문자열 구성 원리

문자열의 간단한 구성 원리를 파악해봅시다. C언어에서 문자는 아래와 같이 표현됩니다.

char c="c";
char *s="string";

"c" 문자는 1byte 크기의 char c에 저장할 수 있지만(저장이 가능한 적절한 주소 경로), "string" 문자열은 1byte 크기를 초과함으로 char에 저장할 수 없습니다.

그래서 문자열은 char *s의 포인터를 사용하여 주소값을 지정합니다. 1byte 크기를 초과하면 다음 주소값으로 이동하여 저장하는 방식으로 문자열을 저장합니다.

 


 

C언어에서는 문자열을 포인터 char형으로 표현하지만, 자바에서는 문자열을 위한 String관련 클래스들을 별도로 제공합니다. 그래서 아래와 같은 구성이 가능합니다.

char[] c = {"s", "t", "r", "i", "n", "g"};
String str = new String(c);

 

 

 


 

2. String VS StringBuffer, StringBuilder

 

문자열의 가변(mutable)과 불변(imutable)

 

문자열의 불변이란?

말그대로 "변경할 수 없다"입니다. 불변이기에 문자 변경이 생긴다면 새로운 문자열 객체를 생성하게 됩니다.

※ 문자열 관련 클래스: java.lang.String

 

문자열의 가변이란?

말그대로 "변경할 수 있다"입니다. 가변이기에 문자 변경이 생긴다면 기존의 문자에서 새로운 문자열이 추가됩니다.

※ 문자열 관련 클래스: java.lang.StringBuffer or java.lang.StringBuilder

 


첫번째, 불변과 가변

 



 

String

JAVA에서 java.lang.String은 "불변" 문자열입니다. 정확히 표현하자면 문자열이 할당된 메모리 공간이 변하지 않습니다. 

 

문자열 조작

"+" 또는 ".concat()" 연산자를 통해 문자열을 추가할 때, 새로운 문자열 객체가 생성되어 참조자는 새로운 문자열 객체로 참조하게 됩니다. 문자열 생성과정은 새로운 객체에 ["기존 문자열" + "새로운 문자열"] 형태의 입력된 상태로 새로운 객체가 생성됩니다. 기존 문자열은 참조자의 참조가 사라져 "Unreachable" 상태가 되어 가비지 컬렉션(GC: Garbage Collection) 대상이 됩니다.(객체는 Heap 메모리 영역에서 생성되고 정리됩니다.)

 

즉, 연산 자체가 객체생성이 됩니다.

 

불변의 장단점

장점: 간단한 조작, 동기화 이슈 없음(Tread-safe), 내부 데이터 공유 가능

단점: 문자열 연산이 많은 경우, 시간과 자원을 많이 사용함에 오버헤드가 발생하여 성능이 다소 좋지 않습니다.

 


 

StringBuffer, StringBuilder

JAVA에서 java.lang.StringBuffer와 java.lang.StringBuider는 "가변" 문자열입니다. 정확히 표현하자면 문자열이 할당된 메모리 공간이 변합니다. 

 

문자열 조작

객체를 한번 생성하고 ".append()"를 통해 문자열을 추가합니다. 추가된 문자열 크기에 따라 크기를 변경해가며 문자열을 변경됩니다. 최종적으로 ".toString()"하여 String 객체를 생성해 최종 문자열로 변환하여 사용합니다.

 

즉, 문자열의 크기를 조작하고 마지막에 String 객체를 한번만 생성하여 문자열을 만듦니다.

 

가변의 장단점 

장점: 문자열 연산이 많은 경우, 성능이 우수합니다.

단점: 수없이 읽는 경우, 새로운 String 객체를 생성하게 됨으로 성능 저하가 발생합니다.

 


두번째, 연산에 따른 String 객체생성 여부


 


 

3. StringBuffer VS StringBuilder

 

StringBuffer와 StringBuilder의 차이점

동기화의 유무

StringBuffer  : 동기화를 지원하여 멀티쓰레드 환경에서 안전합니다.(Thread-safe)

StringBuilder : 동기화를 지원하지 않습니다. 

※ 참고: String은 불변 매개체이기 때문에 Tread-safe 합니다.

 

언제 사용하는가?

StringBuffer  : 멀티쓰레드 환경

StringBuilder : 싱글쓰레드 환경 또는 멀티쓰레드 환경 이여도 동기화가 필요치 않은 경우

※ 참고: StringBuilder는 동기화를 고려하지 않기 때문에 싱글쓰레드 환경에서 연산처리가 빠른 장점이 있습니다.

 

 


세번째, 멀티쓰레드 여부에 따른 동기화 기능


 


 

4. 정리

간략 지표

- String String
Buffer
String
Builder
Storage String pool or Heap Heap Heap
Modifiable No
(immutable)
Yes
(mutable)
Yes
(mutable)
Tread-safe
(Synchronized)
Yes Yes No

 

언제 사용해야할까?

String 문자열 연산이 적을 때
문자열을 읽기 중점으로 사용할 때
멀티쓰레드 환경일 경우 
String
Buffer
문자열 연산을 중점으로 사용할 때
멀티쓰레드 환경일 경우
String
Builder
문자열 연산을 중점으로 사용할 때
단일쓰레드이거나 동기화를 고려하지 않을 경우

 

반응형
profile

Tom's Note

@크크크크

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!