[Java] String, StringBuffer, StringBuilder의 차이점
차이점
String 과 StringBuffer(StringBuilder), 두 클래스 모두 문자열을 담고 연산하는 것인데
차이가 뭐지? 성능이 어떻게 다르지? 궁금했던 분들에게 그 차이점을 스윽 정리해드리고자 한다!
아래 표를 보면 된다 !
String | StringBuffer | StringBuilder |
문자열을 저장하고 관리하는 클래스 | ||
immutable (불변) | mutable (가변) | |
new 연산을 통해 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않는다. 문자열 연산을 했을 때, 메모리 공간이 변하는 것이 아닌 새로운 String 객체를 만드는 것이다. |
문자열 연산에 있어서 new로 객체 생성을 한번 한 후, 연산이 필요할 때 크기를 변경시켜 문자열을 변경한다 |
|
동기화(Synchronized)를 지원한다 멀티스레딩 환경에서 동기화 가능하다 |
동기화(Synchronized) 지원하지 않아 멀티스레딩 환경에서 사용불가능하다 |
표를 슥- 읽고 왔다면 한번 살표볼까?
String str = "Hello";
str += " world";
str += "!!!";
위 코드와 같이 연산을 했을 때, 서로 다른 객체를 계속 생성하게 되는 것이다.
이렇게 새로운 문자열이 만들어지면 기존의 문자열은 가비지 콜렉터에 의해 제거되야 하는 단점(언제 제거될지 모름)이 있고,
이러한 문자열 연산이 많아질 때 계속해서 객체를 만드는 오버헤드가 발생하므로 성능이 떨어질 수 밖에 없다.
대신 String 클래스의 객체는 불변하기 때문에 단순 참조의 경우 String 클래스가 StringBuffer(StringBuilder)보다 좋은 성능을 보인다.
반면 StringBuffer와 StringBuilder 클래스는 문자열 연산에 있어서 클래스를 한번만 만들고(new), 연산이 필요할 때 크기를 변경시켜서 문자열은 변경하므로 문자열 연산이 자주 있을 때 사용하면 성능이 좋다.
사용방법은 다음과 같다.
StringBuffer sb = new StringBuffer();
sb.append("hello");
sb.apeend("world");
String과는 다르게 sb라는 StringBuffer 객체에 append, insert, delete 등의 메소드를 통해 StringBuffer객체가 가지고 있는 문자열 변경이 가능하다.
그렇다면 StringBuffer와 StringBuilder의 차이는 ??
위 표에서 본 것과 같이 StringBuffer는 동기화 지원, StringBuilder는 동기화를 지원하지 않는 차이를 보인다.
결론 !!!!!
String | StringBuffer | StringBuilder | |
적합한 환경 | 문자열 연산이 적고 단순 참조 경우 |
문자열 연산이 많고, 멀티쓰레드 환경 |
싱글쓰레드나 쓰레드를 신경쓰지 않아도 되는 환경 |
성능 | String < StringBuffer < StringBuilder 단, 안정성을 위해서는 StringBuffer를 많이 사용한다. |
'JAVA > Java' 카테고리의 다른 글
[Java] POI 라이브러리 사용 : 엑셀 다운로드 로직 구현하기 (0) | 2022.11.15 |
---|---|
[Java] 특정문자로 문자열 나누기 split 사용방법과 주의점 (0) | 2022.11.15 |
[Java] StartsWith/EndWith : 문자열의 시작/끝 부분과 특정 문자열이 일치하는지 확인하기 (0) | 2022.11.15 |
[Java] StringBuffer append("a"+"b") 메모리는 어떻게 할당될까? (0) | 2022.11.15 |
[Java] String과 new String 차이 (0) | 2022.11.15 |
java Default Method(인터페이스 디폴트 메소드) (0) | 2022.04.26 |
java 이메일 마스킹 처리 (0) | 2022.04.26 |
java 휴대폰번호 마스킹 처리 (0) | 2022.04.26 |