Java/이론 및 문법

[Java] String, StringBuffer, StringBuilder 이해하기

adjh54 2023. 2. 26. 19:06
728x170
해당 페이지에서는 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 저장된 문자열의 길이에 따라 버퍼 크기를 조정합니다.

 
 
 
오늘도 감사합니다. 😀
 
 
 

그리드형