작성 이유
Softeer 문제를 풀다가 단순 구현 문제인데 시간초과가 나는 부분이 있어서 한참을 헤매다가 알게되어 작성하게 되었다.
String, StringBuffer, StringBuilder 특징
String 이란?
Java에서 String은 불변(immutable)한 문자열을 처리하기 위한 클래스입니다.
즉, String 객체가 생성되면 그 값은 변경되지 않습니다. “새로운 객체”로 추가 및 변경이 됩니다.
StringBuffer 란?
Java에서 StringBuffer는 가변(mutable)한 문자열을 처리하기 위한 클래스입니다.
즉, 새로운 문자열을 추가하거나 변경하게 되면 “기존의 객체”로 추가 및 변경이 됩니다.
StringBuilder 란?
Java에서 StringBuilder는 가변(mutable)한 문자열을 처리하기 위한 클래스입니다. (buffer와 동일)
StringBuffer와 마찬가지로 새로운 문자열을 추가하거나 변경하게 되면 “기존의 객체”로 추가 및 변경이 됩니다. (buffer와 동일)
StringBuffer와 다르게 멀티쓰레드 환경에서 안정적이지 않으며, StringBuilder는 싱글쓰레드 환경에서 StringBuffer보다 더 빠른 성능을 가집니다.
그러면 여기서 불변과 가변의 특징은 무엇이며, 어떤 클래스들이 있는지 확인해보자
Immutable(불변)한 클래스
최초 객체를 생성 한 뒤 상태를 변경 할 수 없는 것을 의미.
최초 객체에 추가/변경이 발생하는 경우 객체가 다시 생성된다.
String, Integer, Float, Doube, Long, Short, Byte, Character, BigDecimal, BigInteger 등이 포함된다.
Mutable(가변)한 클래스
최초 객체를 생성 한 뒤 상태를 변경 할 수 있는 것을 의미.
최초 객체에 추가/변경이 발생하는 경우 객체가 다시 생성 된다.
StringBuffer, StringBuilder, ArrayList, LinkedList, HashMap, HashSet, TreeMap, TreeSet 등이 포함된다.
String, StringBuffer, StringBuilder 차이점
| 차이점 | String | StringBuffer | StringBuilder |
| 선언 방식 | String str = "Hello"; | StringBuffer sb = new StringBuffer("Hello"); | StringBuilder sb = new StringBuilder("Hello"); |
| 문자열 변경 방법 | str += " World"; | sb.append(" World"); | sb.append(" World"); |
| 클래스 종류 | 불변(immutable)한 클래스 | 가변(mutable)한 클래스 | 가변(mutable)한 클래스 |
| 변수의 추가 및 변경 시 메모리 성능 | 불리함 | 유리함 | 유리함 |
| 단일 쓰레드 환경에서 성능 | 안정적 | 안정적 | 안정적 |
| 멀티 쓰레드 환경에서 성능 | 안정적 | 안정적, 동기화 과정에서 성능 저하 | 안정적, 동기화 과정에서 성능 저하 X |
| 속도 | 매우 느림 | 빠름 | 빠름 |
| 사용목적 | 문자열 추가와 변경이 발생하지 않는 경우 사용하는 것이 좋다. | 멀티쓰레드 환경에서 문자열의 변수의 추가와 변경이 자주 발생하는 경우 사용하면 좋다. | 단일쓰레드 환경에서 문자열의 변수의 추가와 변경이 자주 발생하는 경우 사용하면 좋다. |
각각의 상태 변경
String => StringBuffer
String str1 = "안녕하세요 반갑습니다.";
// String to StringBuffer
StringBuffer strToSb1 = new StringBuffer(str1); // 안녕하세요 반갑습니다.
// String to StringBuilder
StringBuilder strToSb2 = new StringBuilder(str1); // 안녕하세요 반갑습니다.
StringBuffer => String
// StringBuffer
StringBuffer sb3 = new StringBuffer("안녕하세요 반갑습니다.");
// StringBuffer to String
String str3 = String.valueOf(sb3); // 안녕하세요 반갑습니다.
// StringBuilder
StringBuilder sb4 = new StringBuilder("안녕하세요 반갑습니다.");
// StringBuilder to String
String str4 = String.valueOf(sb4); // 안녕하세요 반갑습니다.
마무리하며
이 글을 작성하면서 지금까지 자주 변하는 문자열들도 String을 사용했었는데 잘못 사용하고 있었던 것이었다...
(어마어마한 성능 저하가 있었을 것 같은 예감이 드는..)
추가적으로 문득 든 생각이 전에 작성했던 "Scanner, BufferReader 차이" 였다..
분명 저기서도 Scanner는 싱글 쓰레드에서 안정적이고, BufferReader는 멀티쓰레드에서 안정적이었다는게 생각이 났다.
여기서 내가 깨달았던 점은 Scanner, BufferReader 둘다 Buffer를 처리하지만, 그 후속 과정에 따라서 Thread safety, Therad unsafety 속성을 가질 수 있다는 점이다.
또한 builder는 디자인 패턴으로 복잡한 객체를 생성하는 방법을 정의하는 클래스와, 표현하는 클래스를 분리하여
서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴이다.
refs
String, StringBuffer, StringBuilder 차이 : https://adjh54.tistory.com/129#google_vignette
[Java] String, StringBuffer, StringBuilder 이해하기
해당 페이지에서는 String과 StringBuffer, StringBuilder에 대해서 이해하고 각각의 차이점과 언제 사용해야 하는지에 대해 이해하기 위한 글입니다. 1) String, StringBuffer, StringBuilder 💡 String이란? - Java에
adjh54.tistory.com
builder란? https://charliezip.tistory.com/17
[JAVA] 빌더 패턴(Builder pattern)
빌더 패턴 빌더 패턴은 복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제
charliezip.tistory.com
'BE > Java' 카테고리의 다른 글
| Springboot3 + Swagger + Jwt (5) (0) | 2024.07.03 |
|---|---|
| Springboot3 + Swagger + Jwt (4) (0) | 2024.06.25 |
| Security 필터 종류? (1) | 2024.06.25 |
| Springboot3 + SpringSecurity + H2 403 (0) | 2024.06.24 |
| Springboot3 + Swagger + Jwt (3) (0) | 2024.06.21 |