일반 String, StringBuilder, StringBuffer

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

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 클래스는 연산이 많고 멀티 쓰레드 환경에서 사용

 

번호 제목 글쓴이 날짜 조회 수
311 ResultSet 의 사이즈로 조회 결과가 있는지 확인 황제낙엽 2021.01.14 42
310 지정한 일자보다 하루 뒤로 설정하기 황제낙엽 2021.01.14 15
309 for, while 등의 loop구문에서 sleep하기 황제낙엽 2020.12.04 55
308 미디어 파일의 metadata를 읽자 (metadata-extractor) file 황제낙엽 2020.08.30 583
307 [HttpURLConnection] Authorization 헤더를 넣어 GET Request 황제낙엽 2020.08.12 376
306 직접 작성한 PropertiesUtil.java 황제낙엽 2020.07.21 35
305 [Online Book] manning사의 making java groovy 황제낙엽 2020.06.19 30
304 자바(JAVA) 어노테이션(Annotation) 황제낙엽 2020.04.10 29
303 [AWS, 웹 프로젝트] AWS+MySQL+SpringFrameWork5+JAVA8+ React+Gradle+Webpack+GIT+Jenkins file 황제낙엽 2020.04.08 48
302 Runtime 클래스의 exec() 함수 실행시의 실행 결과 수집 황제낙엽 2020.03.26 72
301 SQLite JDBC Driver 황제낙엽 2020.02.25 131
300 MySQL 한글깨짐현상 제거 ( UTF8 ) 황제낙엽 2019.12.08 573
299 java.util.ConcurrentModificationException 황제낙엽 2019.09.08 62
» String, StringBuilder, StringBuffer file 황제낙엽 2019.08.03 58
297 String vs StringBuffer vs StringBuilder in Java 황제낙엽 2019.08.03 219
296 Calendar.set() - 날짜 설정하기, Calendar.add() - 날짜 더하기, Calendar.roll() - 그 부분만 날짜 더하기 황제낙엽 2019.08.02 89
295 File 클래스 정리 황제낙엽 2019.07.29 91
294 파일 사이즈를 반환하는 유틸 함수 황제낙엽 2019.07.29 120
293 BufferedReader, BufferedWriter를 활용한 빠른 입출력 황제낙엽 2019.07.29 77
292 현재날짜, 현재시간을 원하는 형태로 출력하는(Format) 다양한 방법 file 황제낙엽 2019.07.29 66