String , StringBuilder, StringBuffer 차이점과 유의사항
String 은 +연산을 했을때
String a = "a"+"b"를 하게 되면
new a = a + b 를 수행하여 새로운 객체에 넣고 기존의 a는 지우는 형태인것이다
왜냐하면 String객체는 immutable로 불변하는 객체이기 때문인데
String 객체 말고 StirngBuilder나 StringBuffer같은 경우는 mutable객체로 변할 수 있는 객체이다
실 예제를 본다면
https://gist.github.com/benelog/b81b4434fb8f2220cd0e900be1634753
여기를 참고 할 수 있다.
JDK 1.5부터는 String을 자동 Builder로 변환해주는데 StringBuilder의 작동원리는 다음과 같다
StringBuilder는 +연산이 왔을때
String a = "a"+"b"
를
String a = (new StringBuilder("a")).append("b").toString();
이런 형태로 기존의 a에 새로운 수행 환경을 만들어서 기존의 a에 넣는 형태이다
이와 같이 StringBuilder는 append를 수행하여 더 붙여 주는 것이다.
그럼 StringBuilder와 StringBuffer의 차이를 알아보자
StringBuilder와 StringBuffer의 차이는 syncronized로 확인할 수 있다.
StringBuffer는 멀티 쓰레드 에서 사용이 가능하다
멀티쓰레드에서는 syncronize를 사용하여 동기화를 지원하도록 한다.
그에 반면 StringBuilder는 따로 동기화를 지원하지 않는다
결론 syncronized를 지원해야하는것은 StringBuffer를 사용하고
싱글 쓰레드로 사용해도 되는 것은 StringBuilder or StringBuffer를 사용한다.
*유의사항*
StringBuilder or StringBuffer를 사용하려고 할때 유의해야하는 내용이 있다
StirngBuilder는 새로운 공간을 만들어서 거기서 수행하고 원래의 변수에 다시 넣는다
그때 이 StringBuilder가 수행하는 영역은 한 줄 만이다
즉
String str2 = "A"
str2 = str2 + "B"
str2 = str2 + "C"
이렇게 되면 한 줄씩 실행하기 때문에 첫번째 문장 실행할때도 new StringBuilder가 만들어지고
두번째문장도 세번째 문장도 만들어진다
이렇게 되면 +연산을 실행했을때와 다름없는 쓸데없는 객체가 생겼다 없어지는것이다
이럴때는 이렇게 해결한다.
StringBuilder sb = new StringBuilder();
sb.append("A")
sb.append("B")
sb.append("C")
밖에서 StringBuilder를 만들어놓고 안에서 직접 append해주는 방법!!!!
이렇게 되면 StringBuilder는 하나만 생성되고 for문 돌면서 알아서 append해준다. !!!
결론적으로
빠른 순서를 알아보면 다음 블로그를 참조하면 도움이 될것
http://egloos.zum.com/deblan2/v/419830
속도는 StringBuilder > StringBuffer > String
*유의사항*
StringBuffer나 StringBuilder는 초기에 생성할 때 Buffer size를 설정하도록 구성되며 이에 대한 생성, 확장 오버로드가 걸리기 때문에 의외로 Buffer Size를 잘못 지정할 경우 성능이 떨어질 가능성도 있음
2017-12-14
내가 이해한 내용
'개발공부' 카테고리의 다른 글
사용하는 포트 (0) | 2018.02.14 |
---|---|
REST API (0) | 2018.01.22 |
JSON (0) | 2018.01.22 |
INFORMATION_SCHEMA (0) | 2017.12.27 |
URI URL URN (0) | 2017.10.07 |