
자바에서 String은 불변(immutable)한 문자열을 처리하기 위한 클래스.
String 객체가 생성되면 그 값은 변경되지 않는다. "새로운 객체"로 추가 및 변경된다.
불변(immutable)한 클래스
- 최초 객체를 생성한 뒤 상태를 변경 할 수 없는 것을 의미. 최초 생성한 객체에 추가나 변경이 발생하는 경우 새로운 객체가 다시 생성이 되어 구성된다.
- ex) String, Integer, Float, Double, Long, Short, Byte, Character, BigDecimal, BigInteger 등
자바에서 StringBuffer는 가변(mutable)한 문자열을 처리하기 위한 클래스.
새로운 문자열을 추가하거나 변경하게 되면 "기존의 객체"로 추가 및 변경된다.
가변(mutable)한 클래스
- 최초 객체를 생성한 뒤 상태를 변경 할 수 있는 것을 의미. 최초 생성한 객체에 추가나 변경이 발생하는 경우 "기존의 객체"에 상태가 변경되어 구성된다.
- ex) StringBuffer, StringBuilder, ArrayList, LinkedList, HashMap, HashSet, TreeMap, TreeSet 등
자바에서 StringBuilder는 가변(mutable)한 문자열을 처리하기 위한 클래스.
StringBuffer와 마찬가지로 새로운 문자열을 추가하거나 변경하게 되면 "기존의 객체"로 추가 및 변경된다.
StringBuffer와 다르게 멀티쓰레드 환경에서 안정적이지 않으며, 싱글쓰레드 환경에서는 더 빠른 성능을 가진다.
싱글쓰레드(Single Thread)
- 하나의 코드 블록을 실행하는 동안 다른 코드 블록이 실행되지 않는 경우. 동시에 하나의 작업만 실행할 수 있음.
멀티쓰레드(Multi Thread)
- 두 개 이상의 쓰레드가 동시에 실행되는 것. 여러 개의 코드 블록이 동시에 실행될 수 있으므로, 멀티쓰레드 환경에서는 동기화(synchronization) 문제가 발생할 수 있으며, 이를 해결하기 위해 락(lock)과 언락(unlock) 메커니즘이 사용된다.
| ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ | ㅤㅤㅤㅤStringㅤㅤㅤㅤ | StringBuffer | StringBuilder |
|---|---|---|---|
| 선언방식 | String str="Hi"; | StringBuffer sb = new StringBuffer("Hi"); |
StringBuilder sb = new StringBuilder("Hi"); |
| 문자열 추가방법 | str += "car"; | sb.append("car"); | sb.append("car"); |
| 클래스 종류 | 불변 | 가변 | 가변 |
| 변수 추가 및 변경시 메모리 성능 |
불리함 | 유리함 | 유리함 |
| 단일쓰레드 환경에서 성능 | 안정적 | 안정적 | 안정적 |
| 멀티쓰레드 환경에서 성능 | 안정적 | 안정적, 동기화 과정에서 성능저하 | 안정적, 동기화 과정에서 성능저하 |
| 속도 | 매우 느림 | 빠름 | 빠름 |
| 사용목적 | 문자열 추가와 변경이 발생하지 않는 경우 사용하는 것이 좋다. |
멀티쓰레드 환경에서 문자열의 변수의 추가/변경이 자주 발생하는 경우 사용하면 좋다. |
단일쓰레드 환경에서 문자열의 변수의 추가/변경이 자주 발생하는 경우 사용하면 좋다. |
① String을 StringBuffer/StringBuilder로 변환방법
String str1 = "안녕하세요.";
// String to StringBuffer
StringBuffer strToSb1 = new StringBuffer(str1); // 안녕하세요.
// String to StringBuilder
StringBuilder strToSb2 = new StringBuilder(str1); // 안녕하세요.
② StringBuffer/StringBuilder 객체를 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); // 반갑습니다.
① StringBuffer 메서드
append(String str) : 문자열 끝에 추가
reverse() : 문자열 뒤집기
insert(int offset, String str) : 지정된 위치에 문자열 삽입
delete(int start, int end) : 지정된 위치에 문자열 삭제
replace(int start, int end, String str) : 지정된 위치에 문자열 대체
substring(int start) : 시작 위치부터 끝까지 문자열 반환
substring(int start, int end) : 지정된 범위의 문자열 반환
toString() :
capacity() : 현재 용량 반환
length() : 문자열 길이 반환 //배열 => length
ensureCapacity(int minimumCapacity) : 최소 용량 보장
setCharAt(int index, char ch) : 지정된 인덱스의 문자를 변경
charAt(int index) : 지정된 인덱스의 문자를 반환
② StringBuilder 메서드
append(String str) : 문자열 덧붙이기
append(char[] str) : 문자배열 덧붙이기
append(Object obj) : 객체 덧붙이기
append(boolean b) : boolean 값 덧붙이기
append(char c) : 문자 덧붙이기
append(int i) : int 값 덧붙이기
append(long lng) : long 값 덧붙이기
append(float f) : float 값 덧붙이기
append(double d) : double 값 덧붙이기
appendCodePoint(int codePoint) : 유니코드 코드포인트 값 덧붙이기
delete(int start, int end) : 지정된 범위의 문자 삭제
deleteCharAt(int index) : 지정된 위치의 문자 삭제
insert(int offset, String str) : 문자열 삽입
insert(int offset, char[] str) : 문자배열 삽입
insert(int offset, Object obj) : 객체 삽입
insert(int offset, boolean b) : boolean 값을 삽입
insert(int offset, char c) : 문자를 삽입
insert(int offset, int i) : int 값을 삽입
insert(int offset, long lng) : long 값을 삽입
insert(int offset, float f) : float 값을 삽입
insert(int offset, double d) : double 값을 삽입
insert(int dstOffset, CharSequence s) : CharSequence를 삽입
insert(int dstOffset, CharSequence s, int start, int end) : 지정된 범위의 CharSequence를 삽입
replace(int start, int end, String str) : 지정된 범위의 문자를 새 문자열로 대체
reverse() : 문자열 뒤집기
substring(int start) : 지정된 시작 위치부터 문자열 끝까지 반환
substring(int start, int end) : 지정된 범위의 문자열 반환
setCharAt(int index, char ch) : 지정된 위치의 문자 설정
setLength(int newLength) : 문자열 길이 설정
trimToSize() : 저장된 문자열 길이에 따라 버퍼 크기 조정
출처: https://adjh54.tistory.com/129#google_vignette
https://velog.io/@gates/JAVA-String-StringBuilder-StringBuffer%EC%9D%98-%EC%B0%A8%EC%9D%B4