일반 String, StringBuilder, StringBuffer

황제낙엽 2019.08.03 07:10 조회 수 : 528

sitelink1 https://blog.naver.com/good_ray/221596411200 
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  

자바에서 대표적으로 문자열을 저장하고 다루기 위해 사용하는 클래스는 3가지가 있습니다.

String, StringBuffer, StringBuilder가 바로 그것들인데요!

과연 이 3가지의 차이점이 무엇이고 언제 각각의 클래스들을 사용해야하는지 구분해야할 필요성이 있습니다.

아래의 String pool은 힙 영역 안에 있는 부분 집합인 것 같다.

String 클래스도 new 연산자를 통해 생성하면 힙영역에 생성

1) String 클래스

일반적으로 문자열을 다룰 때 가장 많이 사용하는 클래스로 사용법이 매우 쉽습니다.

String 클래스와 다른 클래스들과의 가장 큰 차이점은 불변과 변함입니다.

한마디로 String 클래스는 한번 힙 영역에 생성되면 절대 값을 변경될 수 없습니다.

"엥?? 그렇다면 concat함수나 + 연산자를 통해서 값을 항상 변경시키는 경우는 뭔가요?"

String 객체는 값이 변한다라고 표현하는 것이 아닌 새로운 String 객체를 만들어서 합친 문자열을 저장하고 그 값을 참조하도록 하는 것입니다. 그러니깐 String 객체 A에 "hello"라는 문자열이 저장되어있는데 여기에 "world"라는 문자열을 붙이는 연산을 하면 객체 B가 생성이 되며 "helloworld"라는 값이 저장이 됩니다. 즉, 객체 A는 이제 아무도 참조를 안하고 있습니다. 즉, 쓰레기죠. 결국, 가비지커렉션이 수거해가겠지만 문자열 연산이 많을 경우 시간과 공간 성능이 좋지 않습니다. 알고리즘 문제 등에서 문자열 연산이 많을 경우 이 클래스의 사용을 피하시기 바랍니다.

2) StringBuilder 클래스와 StringBuffer 클래스

String 클래스가 불변이라하면 나머지 두 클래스는 바로 변할 수 있다는 성질이 있겠죠?

그렇다면 StringBulider와 StringBuffer의 핵심적인 차이점은 바로 무엇일까요?

자바 API를 참고해보시면 처음 몇 문단 읽어보면 바로 답이나옵니다.

저는 영어를 잘 못하지만 일단 synchronized라는 단어가 두 클래스 문서에서 등장하는 것을 볼 수 있습니다.

image.png

 

StringBuffer

image (1).png

 

StringBuilder

바로 StringBuffer는 동기화를 지원하고 그에 반해 StringBulider는 동기화를 지원하지 않습니다.

단일쓰레드 환경에서 작업 중이라면 StringBulider을 사용하고 반대로, 멀티쓰레드 환경에선 StringBuffer을 사용하여 꼭 안전하게 개발하는 것이 좋을 것 같습니다. 그냥 무조건 안전한 StringBuffer를 쓰면 되는 것 아닌가요? 라는 의문점이 생길 수 있지만 동기화를 처리하는 부분도 하나의 작업이기 때문에 두 가지 클래스를 적절한 상황에 알맞게 사용하는 것이 최적입니다.

즉, 정리하자면!

String 클래스는 연산이 많지 않고 조회가 많으며 멀티 쓰레드 환경에서 사용(불변의 성질 - 안전!)

StringBuilder 클래스는 연산이 많고 단일 쓰레드 환경에서 사용

StringBuffer 클래스는 연산이 많고 멀티 쓰레드 환경에서 사용

 

번호 제목 글쓴이 날짜 조회 수
323 [java.lang.ProcessBuilder] “매개변수가 틀립니다” 혹은 ”Cannot run program” 황제낙엽 2021.10.15 588
322 특정 경로에서 쉘 명령어 실행하기 (ProcessBuilder) 황제낙엽 2021.10.08 451
321 HP-UX, IBM-AIX 황제낙엽 2021.06.23 704
320 nashorn ScriptEninge Test Project (war) file 황제낙엽 2021.05.19 591
319 람다(Lambda)와 함수형 인터페이스 황제낙엽 2021.05.10 630
318 javax.script.ScriptEngine 관련 참고사항 (sample java 포함) 황제낙엽 2021.05.09 815
317 Java Scripting API: GraalVM 적용해보기 황제낙엽 2021.05.09 357
316 Java Scripting API: 바인딩과 스크립트 컨텍스트 그리고 실행 성능 개선 file 황제낙엽 2021.05.09 263
315 Java Scripting API: 자바에서 자바스크립트의 함수를 호출할 수 있을까? file 황제낙엽 2021.05.09 739
314 Java에서 Nashorn JavaScript 엔진 사용 file 황제낙엽 2021.05.09 583
313 [JSP] 파일 다운로드 테스트 file 황제낙엽 2021.04.12 3645
312 ResultSet 을 순회하기 전에 사이즈 구하기 황제낙엽 2021.01.14 321
311 ResultSet 의 사이즈로 조회 결과가 있는지 확인 황제낙엽 2021.01.14 364
310 지정한 일자보다 하루 뒤로 설정하기 황제낙엽 2021.01.14 322
309 for, while 등의 loop구문에서 sleep하기 황제낙엽 2020.12.04 523
308 미디어 파일의 metadata를 읽자 (metadata-extractor) file 황제낙엽 2020.08.30 1115
307 [HttpURLConnection] Authorization 헤더를 넣어 GET Request 황제낙엽 2020.08.12 1123
306 직접 작성한 PropertiesUtil.java 황제낙엽 2020.07.21 584
305 [Online Book] manning사의 making java groovy 황제낙엽 2020.06.19 816
304 자바(JAVA) 어노테이션(Annotation) 황제낙엽 2020.04.10 421