반응형
해당 페이지에서는 String과 StringBuffer, StringBuilder에 대해서 이해하고 각각의 차이점과 언제 사용해야 하는지에 대해 이해하기 위한 글입니다.
1) String, StringBuffer, StringBuilder
💡 String이란?
- Java에서 String은 불변(immutable)한 문자열을 처리하기 위한 클래스입니다. 즉, String 객체가 생성되면 그 값은 변경되지 않습니다. “새로운 객체”로 추가 및 변경이 됩니다.
💡 StringBuffer란?
- Java에서 StringBuffer는 가변(mutable)한 문자열을 처리하기 위한 클래스입니다. 즉, 새로운 문자열을 추가하거나 변경하게 되면 “기존의 객체”로 추가 및 변경이 됩니다.
💡StringBuidler란?
- Java에서 StringBuilder는 가변(mutable)한 문자열을 처리하기 위한 클래스입니다.
- StringBuffer와 마찬가지로 새로운 문자열을 추가하거나 변경하게 되면 “기존의 객체”로 추가 및 변경이 됩니다.
- StringBuffer와 다르게 멀티쓰레드 환경에서 안정적이지 않으며, StringBuilder는 싱글쓰레드 환경에서 StringBuffer보다 더 빠른 성능을 가집니다.
[ 더 알아보기 ]
💡 불변(immutable)한 클래스
- 최초 객체를 생성 한 뒤 상태를 변경 할 수 없는 것을 의미합니다. 최초 생성한 객체에 추가나 변경이 발생하는 경우 새로운 객체가 다시 생성이 되어 구성됩니다.
- Java에서는 String, Integer, Float, Double, Long, Short, Byte, Character, BigDecimal, BigInteger 등의 클래스가 불변 클래스에 속합니다.
💡 가변(mutable)한 클래스
- 최초 객체를 생성 한 뒤 상태를 변경 할 수 있는 것을 의미합니다. 최초 생성한 객체에 추가나 변경이 발생하는 경우 “기존의 객체”에 상태가 변경되어 구성됩니다.
- Java에는 StringBuffer, StringBuilder, ArrayList, LinkedList, HashMap, HashSet, TreeMap, TreeSet 등의 클래스가 가변 클래스에 속합니다.
💡 싱글쓰레드(Single Thread)
- 하나의 코드 블록을 실행하는 동안 다른 코드 블록이 실행되지 않는 경우입니다. 즉, 동시에 하나의 작업만 실행할 수 있습니다.
💡 멀티쓰레드(Multi Thread)
- 두 개 이상의 쓰레드가 동시에 실행되는 것을 말합니다. 여러 개의 코드 블록이 동시에 실행될 수 있으므로, 멀티쓰레드 환경에서는 동기화(synchronization) 문제가 발생할 수 있으며, 이를 해결하기 위해 락(lock)과 언락(unlock) 메커니즘이 사용됩니다.
2) 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을 이용한 객체의 추가 방법
String s = "Hello";
s += " World"; // String 객체가 재 생성된다.
💡 StringBuffer를 이용한 문자열 변경 방법
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 기존의 StringBuffer 객체에 추가가 된다.
💡 StringBuilder를 이용한 문자열 변경 방법
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 기존의 StringBuilder 객체에 추가가 된다.
3) String to StringBuffer, StringBuilder / StringBuffer, StringBuilder to String
1. String을 StringBuffer/StringBuilder로 변환방법
💡 String 객체를 StringBuffer/StringBuilder로 생성시 포함시키면 변환이 가능합니다.
String str1 = "안녕하세요 반갑습니다.";
// String to StringBuffer
StringBuffer strToSb1 = new StringBuffer(str1); // 안녕하세요 반갑습니다.
// String to StringBuilder
StringBuilder strToSb2 = new StringBuilder(str1); // 안녕하세요 반갑습니다.
2. StringBuffer를 String으로 변환방법 : String.valueOf(), .toString()
💡 StringBuffer/StringBuilder 객체를 String.valueOf() 혹은. toString()을 사용하면 변환이 가능합니다.
// 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); // 안녕하세요 반갑습니다.
4) 참고
1. StringBuffer의 메서드
메서드 | 반환타입 | 설명 |
append(String str) | StringBuffer | 문자열을 끝에 추가합니다. |
reverse() | StringBuffer | 문자열을 뒤집습니다. |
insert(int offset, String str) | StringBuffer | 지정된 위치에 문자열을 삽입합니다. |
delete(int start, int end) | StringBuffer | 지정된 범위의 문자열을 삭제합니다. |
replace(int start, int end, String str) | StringBuffer | 지정된 범위의 문자열을 대체합니다. |
substring(int start) | String | 시작 위치부터 끝까지의 문자열을 반환합니다. |
substring(int start, int end) | String | 지정된 범위의 문자열을 반환합니다. |
capacity() | int | 현재 용량을 반환합니다. |
ensureCapacity(int minimumCapacity) | void | 최소 용량을 보장합니다. |
setCharAt(int index, char ch) | void | 지정된 인덱스의 문자를 변경합니다. |
charAt(int index) | char | 지정된 인덱스의 문자를 반환합니다. |
length() | int | 문자열의 길이를 반환합니다. |
toString() | String | String 객체로 변환합니다. |
2. StringBuilder의 메서드
메서드 | 반환타입 | 설명 |
append(String str) | StringBuffer/StringBuilder | 문자열을 덧붙입니다. |
append(char[] str) | StringBuffer/StringBuilder | 문자 배열을 덧붙입니다. |
append(Object obj) | StringBuffer/StringBuilder | 객체를 덧붙입니다. |
append(boolean b) | StringBuffer/StringBuilder | boolean 값을 덧붙입니다. |
append(char c) | StringBuffer/StringBuilder | 문자를 덧붙입니다. |
append(int i) | StringBuffer/StringBuilder | int 값을 덧붙입니다. |
append(long lng) | StringBuffer/StringBuilder | long 값을 덧붙입니다. |
append(float f) | StringBuffer/StringBuilder | float 값을 덧붙입니다. |
append(double d) | StringBuffer/StringBuilder | double 값을 덧붙입니다. |
appendCodePoint(int codePoint) | StringBuffer/StringBuilder | 유니코드 코드 포인트를 덧붙입니다. |
delete(int start, int end) | StringBuffer/StringBuilder | 지정된 범위의 문자를 삭제합니다. |
deleteCharAt(int index) | StringBuffer/StringBuilder | 지정된 위치의 문자를 삭제합니다. |
insert(int offset, String str) | StringBuffer/StringBuilder | 문자열을 삽입합니다. |
insert(int offset, char[] str) | StringBuffer/StringBuilder | 문자 배열을 삽입합니다. |
insert(int offset, Object obj) | StringBuffer/StringBuilder | 객체를 삽입합니다. |
insert(int offset, boolean b) | StringBuffer/StringBuilder | boolean 값을 삽입합니다. |
insert(int offset, char c) | StringBuffer/StringBuilder | 문자를 삽입합니다. |
insert(int offset, int i) | StringBuffer/StringBuilder | int 값을 삽입합니다. |
insert(int offset, long lng) | StringBuffer/StringBuilder | long 값을 삽입합니다. |
insert(int offset, float f) | StringBuffer/StringBuilder | float 값을 삽입합니다. |
insert(int offset, double d) | StringBuffer/StringBuilder | double 값을 삽입합니다. |
insert(int dstOffset, CharSequence s) | StringBuffer/StringBuilder | CharSequence를 삽입합니다. |
insert(int dstOffset, CharSequence s, int start, int end) | StringBuffer/StringBuilder | 지정된 범위의 CharSequence를 삽입합니다. |
replace(int start, int end, String str) | StringBuffer/StringBuilder | 지정된 범위의 문자를 새 문자열로 대체합니다. |
reverse() | StringBuffer/StringBuilder | 문자열을 뒤집습니다. |
setCharAt(int index, char ch) | void | 지정된 위치의 문자를 설정합니다. |
setLength(int newLength) | void | 문자열의 길이를 설정합니다. |
substring(int start) | String | 지정된 시작 위치부터 문자열 끝까지 반환합니다. |
substring(int start, int end) | String | 지정된 범위의 문자열을 반환합니다. |
trimToSize() | void | 저장된 문자열의 길이에 따라 버퍼 크기를 조정합니다. |
오늘도 감사합니다. 😀
반응형
'Java > 공통 모듈' 카테고리의 다른 글
[Java] 자주 사용하는 패턴 -1 : 배열/리스트 조작 (0) | 2023.11.03 |
---|---|
[Java] String 함수 이해하기 : format, join, valueOf, copyValueOf (0) | 2023.05.08 |
[Java] Stream API -3 이해하기: Stream 최종연산 (0) | 2023.02.14 |
[Java] Stream API -2 이해하기: Stream 중간연산 (4) | 2023.02.08 |
[Java] Stream API -1 이해하기: 용어 및 Stream 생성 (4) | 2023.02.05 |