공부해봅시당
[쉽게 배우자! JAVA] String, StringBuffer, StringBuilder의 차이점을 알아보자 본문
기본 개념
먼저, 혹시나 String을 기본 자료형으로 생각하고 있을 분들을 위해!
String은 기본 자료형이 아닌, 클래스이다!
(참고로 기본 자료형은 정수형(byte, short, int, long), 실수형(float, double), 문자형(char), 논리형(boolean)으로 이루어져 있다)
따라서 우리는 String을 초기화할 때
String a = "Hello"; // 이렇게 쓰기도 하지만
String b = new String("Hello"); // 이렇게 쓸 수도 있다!
지금부터 우리가 살펴볼 String, StringBuffer, StringBuilder는 이러한 점에서 모두 클래스라는 공통점을 가지고 있다.
따라서 String과 StringBuffer, StringBuilder는 기본 자료형이 아닌, 클래스를 통해 생성한 객체라는 점에 유의하면서 글을 읽어보도록 하자!
'String'과 'StringBuffer, StringBuilder'의 차이점은?
가장 큰 차이점은 '변하느냐, 변하지 않느냐'이다.
이것을 두고 간략하게 영어로 'immutable(불변)', 'mutable(변할 수 있음)'이라고 한다.
변할 수 있니? | |
String | 불가능! (immutable) |
StringBuffer StringBuilder |
가능! (mutable) |
그럼 뭐가 변할 수 있고, 뭐가 변할 수 없다는 걸까?
'immutable'과 'mutable'
위에서 String과 StringBuffer, StringBuilder의 가장 큰 차이점은 'immutable' 한 것과 'mutable' 한 것에 있다고 했다.
그럼 우리는 궁금해질 것이다.
'뭐가 mutable하고, 뭐가 immutable 하다는 거야?'
그것은 바로 '메모리 공간'이다.
메모리 공간이 immutable 하다는 것의 의미는 '객체가 초기화된 이후, 변경될 수 없다는 것'이다.
< 참고한 자료의 원문 첨부 >
In java , if an object is immutable then it can not be changed after creation.
(https://javahungry.blogspot.com/2015/07/why-string-is-final-or-immutable-in-java-with-example.html)
위에서 String은 immutable하다고 했는데, 우리는 평소에 String에 변경 작업을 많이 해왔었다.
예를 들어 아래와 같이 문자열을 추가적으로 붙여주는 연산이 있을 수 있다.
String str = "Hello";
str = str + " world";
여기서 우리는 흔히, str 변수에 "Hello"를 초기화하고 이 뒤에 " world"가 붙는다고 생각해 왔을 것이다.
아래 그림처럼 말이다. 그럼 이건 변경될 수 있다는 뜻 아닌가?
하지만 조금 더 자세히 파고들어 보면 그렇지 않다는 것을 알 수 있다.
String에 더하기 연산을 하면 실제로는 이렇게 처리가 된다.
String은 초기화 시, JVM 메모리 중 힙(heap) 영역에 생성된다.
이후 더하기 연산을 했을 때, 기존에 가지고 있던 "Hello"에 " world"를 더해 만들어진 새로운 메모리 영역을 가르키게 된다.
기존에 가지고 있던 "Hello" 메모리 영역은 이때 Garbage(쓰레기)로 남아있다가 GC(Garbage collection)에 의해 사라지게 된다!
따라서 우리는 String에서 더하기 연산을 할 때마다 Garbage 메모리 영역을 늘리고 있는 셈인 것이다.
위 한 가지 예시만으로 이해가 잘 안 된다면 밑의 예시를 통해 이해하도록 해보자!
여기까지 immutable, 즉 불변의 의미를 살펴보았다.
그렇다면 mutable, 즉 변할 수 있다는 것의 의미는 무엇일까?
앞에서 immutable의 의미를 알았으니 예상이 가능할 것이다. 바로 그림으로 알아보자!
StringBuffer는 내부 Buffer에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 할 수 있도록 설계되어 있다!
StringBuffer는 append()메소드를 통해 문자열 덧셈 연산, delete()메소드를 통해 문자열 제거 연산, subString()메소드를 통해 특정 문자열 추출 연산을 하는 등 제공하는 기능도 다양하다
StringBuilder 또한 StringBuffer와 동일하게 쓰인다.
따라서 연산 작업이 많을 경우 String보다 StringBuffer 혹은 StringBuilder를 쓰는 것이 더 적합하다.
그렇다면 String은 어떨 때 적합할까?
immutable한 객체의 특징은 thread-safe하다는 점이다. 따라서 String은 immutable하기 때문에 thread-safe하다는 장점이 있어, 여러 개의 스레드가 동시에 접근하여 읽어도 변하지 않는 값이기 때문에 문제가 발생하지 않는다.
따라서 동기화 문제를 고려하지 않고 내부 데이터를 자유롭게 공유할 수 있다는 장점이 있다고 한다.
StringBuilder와 StringBuffer의 차이
지금까지 'String'과 'StringBuffer, StringBuilder'의 차이에 대해 알아보았다.
그럼 StringBuilder와 StringBuffer의 차이는 무엇일까?
StringBuilder와 StringBuffer의 차이는 멀티쓰레드 안정성이다.
StringBuffer는 각 메소드 별로 Synchronized Keyword 가 존재하여, 멀티스레드 환경에서도 동기화를 지원한다.
하지만, StringBuilder는 동기화를 보장하지 않는다.
(하지만 그렇기 때문에 StringBuffer보다 빠르다는 장점이 있다.)
따라서 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고, 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다.
단일스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다고 한다.
(위에서부터 계속 언급되었던 thread가 잘 이해되지 않는 분들을 위해, 쓰레드 관련 내용은 추후 포스팅을 할 예정이니 그 때 참고를 다시 해주면 좋겠다. 사실 본인도 공부하는 입장인지라 thread를 공부해야 하기 때문이다!)
최종 정리
최근 근황
JDK 1.5버전 이전에서는 문자열연산(+, concat)을 할때, 조합된 문자열을 새로운 메모리에 할당하여 참조함으로 인해서 성능상의 이슈가 있었다고 한다.
하지만 JDK1.5 버전 이후에는 컴파일 단계에서 String 객체를 사용하더라도 StringBuilder로 컴파일 되도록 변경되었다.
따라서 JDK 1.5 이후 버전에서는 String 클래스를 활용해도 StringBuilder와 성능상으로 차이가 없어져버렸다(!)
하지만 반복 루프를 사용해서 문자열을 더할 때에는 객체를 계속 추가한다는 사실에는 변함이 없다고 한다!!
따라서 String 클래스를 쓰는 대신, 스레드와 관련이 있으면 StringBuffer를, 스레드 안전 여부와 상관이 없으면 StringBuilder를 사용하는 것을 권장한다!
더 궁금한 점이 있다면 아래 참고자료를 활용하거나 본인이 더 찾아보면 될거 같다
그럼 빠잉!
참고자료
https://jeong-pro.tistory.com/85
JAVA String, StringBuffer, StringBuilder 차이점
String, StringBuffer, StringBuilder의 장단점 및 차이점 자바에서 String과 StringBuffer, StringBuilder의 차이점을 알아본다. 앞서 이 클래스들의 공통점은 모두다 String(문자열)을 저장하고 관리하는 클래스..
jeong-pro.tistory.com
https://ifuwanna.tistory.com/221
[Java] String, StringBuffer, StringBuilder 차이 및 장단점
Java 에서 문자열을 다루를 대표적인 클래스로 String , StringBuffer, StringBuilder 가 있습니다. 연산이 많지 않을때는 위에 나열된 어떤 클래스를 사용하더라도 이슈가 발생할 가능성은 거의 없습니다
ifuwanna.tistory.com
[자바] String, StringBuilder, StringBuffer의 차이
* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자..
12bme.tistory.com
https://coding-factory.tistory.com/546
[Java] String, StringBuffer, StringBuilder의 차이점과 사용이유
자바에서는 문자열을 다루는 클래스로 String, StringBuffer, StringBuilder이라는 3가지 클래스가 있습니다. 위 3가지 클래스는 모두 문자열을 저장하고 관리하는 클래스이며 각 클래스 간에는 조금의 차
coding-factory.tistory.com
https://cjh5414.github.io/why-StringBuffer-and-StringBuilder-are-better-than-String/
StringBuffer, StringBuilder 가 String 보다 성능이 좋은 이유와 원리
Jihun's Development Blog
cjh5414.github.io
https://myhappyman.tistory.com/151
JAVA - String, StringBuffer, StringBuilder 알고 쓰기
처음 대학에 들어가 c언어를 배우면서 일상에서 쉽게 사용하던 문자열들이 굉장히 어렵게 처리했던것들이 기억난다. char형의 배열로 문자열형태를 만들고 제어했는데, 자바는 String 클래스 하나
myhappyman.tistory.com
https://m.blog.naver.com/piyoro/221881663313
[자바] String, StringBuffer, StringBuilder 차이점
다른 내용을 검색 중에 우연히 https://asfirstalways.tistory.com/336?category=660807 포스팅을 보...
blog.naver.com
https://asfirstalways.tistory.com/336?category=660807
[JAVA Adv] StringBuffer vs StringBuilder 그리고 String
StringBuffer vs StringBuilder String 의 정체 두 클래스의 차이를 알기 위해서 일단 String 객체의 정체를 짚어보고 가자. String 객체는 기본적으로 immutable 이다. 내부적으로 char[] 배열을 사용하고 있고..
asfirstalways.tistory.com
https://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html
Difference Between String , StringBuilder and StringBuffer Classes with Example : Java | Java Hungry
javahungry.blogspot.com
https://javahungry.blogspot.com/2015/07/why-string-is-final-or-immutable-in-java-with-example.html
Why String is final or immutable in Java with Example | Java Hungry
Before going into details as why String is final or immutable in java , first let us understand the meaning of the term "immutable". What does immutable means? Note : In java , if an object is immutable then it can not be changed after creation. How Stri
javahungry.blogspot.com
String, StringBuffer, StringBuilder 차이점과 장단점
Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (그리고 많은 회사들이 기술 면접 시에 이걸 물어보기도 한답니다.) String, StringBuffer, StringBuilder ... 모두 문자열을 저장하고, 관리하는
ooz.co.kr
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] Generic을 간단하게 알아보자 (1) | 2024.03.06 |
---|---|
[JAVA] 자바의 Reflection (0) | 2024.03.06 |
[JAVA] Java의 Synchronization이란? (0) | 2024.03.06 |
[JAVA] Garbage Collection(가비지 컬렉션)을 톺아보자 (0) | 2024.03.06 |
[쉽게 배우자! JAVA] 컴파일 과정 (0) | 2023.10.31 |