일반 String, StringBuilder, StringBuffer

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

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

 

번호 제목 글쓴이 날짜 조회 수
303 [AWS, 웹 프로젝트] AWS+MySQL+SpringFrameWork5+JAVA8+ React+Gradle+Webpack+GIT+Jenkins file 황제낙엽 2020.04.08 553
302 Runtime 클래스의 exec() 함수 실행시의 실행 결과 수집 황제낙엽 2020.03.26 359
301 SQLite JDBC Driver 황제낙엽 2020.02.25 3625
300 MySQL 한글깨짐현상 제거 ( UTF8 ) 황제낙엽 2019.12.08 825
299 java.util.ConcurrentModificationException 황제낙엽 2019.09.08 346
» String, StringBuilder, StringBuffer file 황제낙엽 2019.08.03 499
297 String vs StringBuffer vs StringBuilder in Java 황제낙엽 2019.08.03 747
296 Calendar.set() - 날짜 설정하기, Calendar.add() - 날짜 더하기, Calendar.roll() - 그 부분만 날짜 더하기 황제낙엽 2019.08.02 423
295 File 클래스 정리 황제낙엽 2019.07.29 437
294 파일 사이즈를 반환하는 유틸 함수 황제낙엽 2019.07.29 481
293 BufferedReader, BufferedWriter를 활용한 빠른 입출력 황제낙엽 2019.07.29 448
292 현재날짜, 현재시간을 원하는 형태로 출력하는(Format) 다양한 방법 file 황제낙엽 2019.07.29 386
291 자바 소수점 n번째 자리까지 반올림하기 황제낙엽 2019.07.29 473
290 java base64 encodeing,decoding 사용법 황제낙엽 2019.07.24 475
289 java.lang.StackTraceElement Class의 내용 출력 황제낙엽 2019.07.03 453
288 세션의 timeout 설정 >> HttpSession.setMaxInactiveInterval() 황제낙엽 2019.07.03 8579
287 jQuery JSON 데이터 통신의 특성 (HttpServletRequest) 황제낙엽 2019.06.23 522
286 [HttpURLConnection] 서버와의 통신 시도 시점 관련 황제낙엽 2019.06.23 577
285 역컴파일러 (decompiler, jad.exe) file 황제낙엽 2019.06.20 507
284 Microsoft SQL Server JDBC 드라이버 2.0 file 황제낙엽 2019.05.22 470