# String 사용에 대한 이야기

## 1. String은 gc에 영향을 준다. 왜 ?

프로그램 코드 작성시 가장 많이 사용하는 객체가 String, Collection이다. 특히 String 연산은 코드에서 여러가지 이유로 많이 사용 한다.&#x20;

다음 코드를 보자

```java
final String aValue = "abcde";
String a = new String();
for ( int index = 0 ; index < 10000 ; index ++ ) {
    a += aValue;
}
```

**a의 메모리 사용량은 어떻게 될까 ?**

| <p>첫번째 수행 : a += aValue <br><br>723 번지 : gc 대상</p> | <img src="https://1889142648-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVfLaXPTe0t3ptNpFbmH5%2Fuploads%2FucTLogpEdLnMdyizZTdZ%2Fimage.png?alt=media&#x26;token=642ed926-2663-48a8-8dc7-23b5e12c7931" alt="" data-size="original"> |
| -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p>두번째 수행 : a += aValue<br><br>725 번지 : gc 대상</p>  | <img src="https://1889142648-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVfLaXPTe0t3ptNpFbmH5%2Fuploads%2FMVEcdO0rASuKUhAkanVq%2Fimage.png?alt=media&#x26;token=d576ee86-95ec-46d6-9517-845682c9bab6" alt="" data-size="original"> |
| <p>세번째 수행 : a += aValue<br><br>.....</p>           | <img src="https://1889142648-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVfLaXPTe0t3ptNpFbmH5%2Fuploads%2FWDJsoDVWtRPdXOOntUYl%2Fimage.png?alt=media&#x26;token=7d995513-bd2c-480e-8694-e164b7df9e90" alt="" data-size="original"> |

데이터 크기도 커지면서 주소 할당을 하고 있다. 사용하지 않는 주소는 gc대상 입니다.

## 2. StringBuffer or StringBuilder로 변경

```java
final String aValue = "abcde";
StringBuffer a = new StringBuffer();
for ( int index = 0 ; index < 10000 ; index ++ ) {
    a.append(aValue);
}
```

| 첫번째 수행 : a.append(aValue) | <img src="https://1889142648-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVfLaXPTe0t3ptNpFbmH5%2Fuploads%2FtdUZ3Ad9kwJUySzZDya0%2Fimage.png?alt=media&#x26;token=43c5e381-d882-4984-a04d-73c4501b12f8" alt="" data-size="original"> |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 두번째 수행 : a.append(aValue) | <img src="https://1889142648-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVfLaXPTe0t3ptNpFbmH5%2Fuploads%2FqEk4avjHbBAc9y6LH14x%2Fimage.png?alt=media&#x26;token=7100e05a-a499-4796-a5b9-17f68d642e7f" alt="" data-size="original"> |
| 세번째 수행 : a.append(aValue) | <img src="https://1889142648-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVfLaXPTe0t3ptNpFbmH5%2Fuploads%2FsL45mbnga9wXxuDXXiAE%2Fimage.png?alt=media&#x26;token=904c4742-4711-4551-a875-a5888e93d436" alt="" data-size="original"> |

주소는 변경 되지 않고 데이터 만 변경되어 들어 간다.&#x20;

## 3. StringBuffer와 StringBuilder를 어떻게 사용해야 하나

* StringBuffer
  * 스레드에 안전한 프로그램이 필요할 때 사용&#x20;
  * 즉. 멀티쓰레드환경에서 synchronized키워드가 가능하므로 동기화가 가능
  * static으로 선언한 문자열 변경 또는 singleton으로 선언된 클래스에 선언된 문자열&#x20;
* StringBuilder
  * 스레드에 안전한지 여부와 전혀 관계 없는 코드
  * 즉. 동기화를 지원하지 않기 때문에 멀티 쓰레드 환경에서는 적합하지 않다.
  * 메서드내 지역 변수
