1. 자바의 자료형
String Buffer를 설명하기에 앞서 자바의 자료형에는 기본형(Primitive Type)과 참조형(Reference Type)이 있다. 기본형은 값 자체를 저장하는 형태로 정수형, 실수형, 문자형(char), 논리형이 기본형에 속한다. 반면, 참조형 주소값을 담고 있으며, 실제로는 주소가 가리키는 객체나 배열 같은 데이터를 참조하는 형태이다.
기본적으로 자바의 8가지 기본형(Primitive Type)이 아닌 모든 데이터는 참조형에 속한다. 리스트나 맵, 집합처럼 우리가 아는 자바 컬렉션 프레임워크에서 제공하는 자료형들이 참조형이다. 그리고 흔히 문자열이라고 부르는 String도 참조형에 속한다.
참조형(Reference Type)
- 클래스 (Class): 사용자가 정의한 객체
- 배열 (Array): 동일한 자료형의 값들 집합
- 리스트(ArrayList) : 순서가 있는 데이터의 집합(index)
- 맵(Map) : 키-값 쌍(key-value pair)의 집합(key)
- 집합(Set) : 중복을 허용하지 않는 데이터의 집합, 순서x
- 인터페이스 (Interface): 다형성을 제공
- 열거형 (Enum): 특정한 집합의 상수들을 정의한 열거형
- 문자열 (String)
2. StringBuffer의 작동원리
String(문자열)을 추가하거나 변경할 때 사용되는 클래스가 StringBuffer이다.
코딩테스트에서 문자열을 하나로 연결해서 반환하는 문제를 풀 때 StringBuffer 객체가 사용되는 것을 자주 볼 수 있다.
StringBuffer는 문자열을 효율적으로 수정하고 처리하기 위한 도구로, 기본 자료형처럼 단순히 값만 저장하는 것이 아니라, 문자열 데이터와 관련된 여러 기능을 제공하는 객체를 만들기 위한 클래스이다. 즉, StringBuffer를 문자열을 다루는 참조형 객체를 생성할 수 있는 클래스로 이해하는 것이 정확하다.
StringBuffer의 원리는 문자열을 효율적으로 관리하기 위해 변경 가능한(mutable) 버퍼(buffer)를 사용한다. 즉, 문자열의 길이가 변할 때마다 새 객체를 생성하지 않고 기존 객체를 수정하는 방식이다. 이를 가변 문자열 클래스라고 부른다. 반면 String은 변경할 때 마다 새 객체를 생성한다.
값을 변경할 수 없는 것을 ‘이뮤터블(immutable)하다’, 변경할 수 있는 것을 ‘뮤터블(mutable)하다’라고 한다.
StringBuffer는 성능과 메모리 효율성이 최적화되어 있기 때문에 처리해야 할 데이터가 많을 때 String 보다 효율적이다.
예를 들면, "Hello "와 "World!" 를 붙여서 출력하는 상황을 가정해 보자.
String Buffer는 버퍼에 "Hello "라는 문자열과 "World!"라는 문자열을 차례로 붙여 두고, 한 번에 반환한다. StringBuffer가 문자열을 한 번에 반환할 때는, 내부 버퍼에 저장된 문자 배열을 toString() 메서드를 호출하여 String 객체로 변환하여 반환한다.

3. StringBuffer 메서드
- append(String str): 문자열을 추가
- insert(int offset, String str): 지정한 위치에 문자열을 삽입
- delete(int start, int end): 지정한 범위의 문자열을 삭제
- replace(int start, int end, String str): 지정한 범위의 문자열을 다른 문자열로 대체
- reverse(): 문자열을 역순으로 뒤집기
- toString(): StringBuffer 객체를 String으로 변환(문자열로 출력하거나 리턴할 때)
- subsring(시작위치, 끝 위치) : 문자열을 지정한 범위로 슬라이싱
public class StringBufferExample {
public static void main(String[] args) {
// 초기 용량 16의 버퍼 생성
StringBuffer sb = new StringBuffer("Hello");
// 문자열 추가 (append)
sb.append(" World"); // "Hello World"
// 문자열 삽입 (insert)
sb.insert(6, "Java "); // "Hello Java World"
// 문자열 삭제 (delete)
sb.delete(6, 11); // "Hello World"
// 문자열 뒤집기 (reverse)
sb.reverse(); // "dlroW olleH"
System.out.println(sb.toString()); // 최종 출력: "dlroW olleH"
System.out.println(sb.substring(0, 4)); // 최종 출력: "dlro"
}
}
4. StringBuffer vs String
StringBuffer sb = new StringBuffer(); // StringBuffer 객체 sb 생성
sb.append("hello");
sb.append(" ");
sb.append("World!");
String result = sb.toString();
System.out.println(result); // "hello World!" 출력
StringBuffer은 append 메서드를 사용하여 문자열을 계속해서 추가해 나갈 수 있다.
그리고 toString() 메서드를 사용하면 StringBuffer를 String 자료형으로 변경할 수도 있다.
같은 코드를 StringBuffer 대신 String 자료형을 사용하도록 변경해 보자.
String result = "";
result += "hello";
result += " ";
result += "World!";
System.out.println(result); // "hello World!" 출력
두 번째 코드와 첫 번재 코드의 결과는 같지만 내부적으로 객체를 생성하고 메모리를 사용하는 과정에는 차이가 있다. 첫 번째 코드에서는 StringBuffer 객체를 한 번만 생성하지만, 두 번째에서는 String 자료형에 + 연산이 있을 때마다 새로운 String 객체를 생성하므로 총 4개의 String 자료형 객체가 만들어진다.
또 String 자료형은 값이 한 번 생성되면 변경할 수가 없다. toUpperCase와 같은 메서드를 보면 문자열이 변경되는 것처럼 생각할 수도 있지만 해당 메서드를 수행할 때 또 다른 String 객체를 생성하여 리턴하는 것이다. 반면에 StringBuffer 자료형은 값을 수정해서 사용한다.
그렇다면 무조건 StringBuffer를 사용하는 것이 좋을까? 그건 상황에 따라 다르다. StringBuffer 자료형은 String 자료형보다 무겁다. new StringBuffer()로 객체를 생성하면 String을 사용할 때보다 메모리 사용량도 많고 속도도 느리다. 따라서 문자열을 추가하거나 변경하는 작업이 많으면 StringBuffer를, 적으면 String을 사용하는 것이 유리하다.
* String Builder ?
StringBuilder는 StringBuffer와 비슷한 자료형으로, 사용법도 같다.
StringBuffer는 멀티 스레드 환경에서 안전하고, StringBuilder는 StringBuffer보다 성능이 우수하다는 장점이 있다.
따라서 동기화를 고려할 필요가 없는 상황에서는 StringBuffer < StringBuilder
참고한 자료 : Ghat GPT & 박응용, 점프투자바
'Java' 카테고리의 다른 글
[Java] JDBC 오라클이랑 자바 연동 (31) | 2024.11.04 |
---|---|
[Java] ArrayList, 제네릭스(Generics), 정렬, Join, String.join 정리 (8) | 2024.11.03 |
[Java] BufferedReader / BufferedWriter (입출력 함수), StringTokenizer, split, BufferedWriter, StringBuilder (4) | 2024.10.27 |
[Java] 자바8 Stream으로 List를 map으로 변환하기 (1) | 2024.10.27 |
찾아보다가 답답해서 내가 작성한 아주 쉽게 이해하는 서블릿의 개념과 작동원리! (+그림 포함) (0) | 2024.04.24 |
1. 자바의 자료형
String Buffer를 설명하기에 앞서 자바의 자료형에는 기본형(Primitive Type)과 참조형(Reference Type)이 있다. 기본형은 값 자체를 저장하는 형태로 정수형, 실수형, 문자형(char), 논리형이 기본형에 속한다. 반면, 참조형 주소값을 담고 있으며, 실제로는 주소가 가리키는 객체나 배열 같은 데이터를 참조하는 형태이다.
기본적으로 자바의 8가지 기본형(Primitive Type)이 아닌 모든 데이터는 참조형에 속한다. 리스트나 맵, 집합처럼 우리가 아는 자바 컬렉션 프레임워크에서 제공하는 자료형들이 참조형이다. 그리고 흔히 문자열이라고 부르는 String도 참조형에 속한다.
참조형(Reference Type)
- 클래스 (Class): 사용자가 정의한 객체
- 배열 (Array): 동일한 자료형의 값들 집합
- 리스트(ArrayList) : 순서가 있는 데이터의 집합(index)
- 맵(Map) : 키-값 쌍(key-value pair)의 집합(key)
- 집합(Set) : 중복을 허용하지 않는 데이터의 집합, 순서x
- 인터페이스 (Interface): 다형성을 제공
- 열거형 (Enum): 특정한 집합의 상수들을 정의한 열거형
- 문자열 (String)
2. StringBuffer의 작동원리
String(문자열)을 추가하거나 변경할 때 사용되는 클래스가 StringBuffer이다.
코딩테스트에서 문자열을 하나로 연결해서 반환하는 문제를 풀 때 StringBuffer 객체가 사용되는 것을 자주 볼 수 있다.
StringBuffer는 문자열을 효율적으로 수정하고 처리하기 위한 도구로, 기본 자료형처럼 단순히 값만 저장하는 것이 아니라, 문자열 데이터와 관련된 여러 기능을 제공하는 객체를 만들기 위한 클래스이다. 즉, StringBuffer를 문자열을 다루는 참조형 객체를 생성할 수 있는 클래스로 이해하는 것이 정확하다.
StringBuffer의 원리는 문자열을 효율적으로 관리하기 위해 변경 가능한(mutable) 버퍼(buffer)를 사용한다. 즉, 문자열의 길이가 변할 때마다 새 객체를 생성하지 않고 기존 객체를 수정하는 방식이다. 이를 가변 문자열 클래스라고 부른다. 반면 String은 변경할 때 마다 새 객체를 생성한다.
값을 변경할 수 없는 것을 ‘이뮤터블(immutable)하다’, 변경할 수 있는 것을 ‘뮤터블(mutable)하다’라고 한다.
StringBuffer는 성능과 메모리 효율성이 최적화되어 있기 때문에 처리해야 할 데이터가 많을 때 String 보다 효율적이다.
예를 들면, "Hello "와 "World!" 를 붙여서 출력하는 상황을 가정해 보자.
String Buffer는 버퍼에 "Hello "라는 문자열과 "World!"라는 문자열을 차례로 붙여 두고, 한 번에 반환한다. StringBuffer가 문자열을 한 번에 반환할 때는, 내부 버퍼에 저장된 문자 배열을 toString() 메서드를 호출하여 String 객체로 변환하여 반환한다.

3. StringBuffer 메서드
- append(String str): 문자열을 추가
- insert(int offset, String str): 지정한 위치에 문자열을 삽입
- delete(int start, int end): 지정한 범위의 문자열을 삭제
- replace(int start, int end, String str): 지정한 범위의 문자열을 다른 문자열로 대체
- reverse(): 문자열을 역순으로 뒤집기
- toString(): StringBuffer 객체를 String으로 변환(문자열로 출력하거나 리턴할 때)
- subsring(시작위치, 끝 위치) : 문자열을 지정한 범위로 슬라이싱
public class StringBufferExample { public static void main(String[] args) { // 초기 용량 16의 버퍼 생성 StringBuffer sb = new StringBuffer("Hello"); // 문자열 추가 (append) sb.append(" World"); // "Hello World" // 문자열 삽입 (insert) sb.insert(6, "Java "); // "Hello Java World" // 문자열 삭제 (delete) sb.delete(6, 11); // "Hello World" // 문자열 뒤집기 (reverse) sb.reverse(); // "dlroW olleH" System.out.println(sb.toString()); // 최종 출력: "dlroW olleH" System.out.println(sb.substring(0, 4)); // 최종 출력: "dlro" } }
4. StringBuffer vs String
StringBuffer sb = new StringBuffer(); // StringBuffer 객체 sb 생성 sb.append("hello"); sb.append(" "); sb.append("World!"); String result = sb.toString(); System.out.println(result); // "hello World!" 출력
StringBuffer은 append 메서드를 사용하여 문자열을 계속해서 추가해 나갈 수 있다.
그리고 toString() 메서드를 사용하면 StringBuffer를 String 자료형으로 변경할 수도 있다.
같은 코드를 StringBuffer 대신 String 자료형을 사용하도록 변경해 보자.
String result = ""; result += "hello"; result += " "; result += "World!"; System.out.println(result); // "hello World!" 출력
두 번째 코드와 첫 번재 코드의 결과는 같지만 내부적으로 객체를 생성하고 메모리를 사용하는 과정에는 차이가 있다. 첫 번째 코드에서는 StringBuffer 객체를 한 번만 생성하지만, 두 번째에서는 String 자료형에 + 연산이 있을 때마다 새로운 String 객체를 생성하므로 총 4개의 String 자료형 객체가 만들어진다.
또 String 자료형은 값이 한 번 생성되면 변경할 수가 없다. toUpperCase와 같은 메서드를 보면 문자열이 변경되는 것처럼 생각할 수도 있지만 해당 메서드를 수행할 때 또 다른 String 객체를 생성하여 리턴하는 것이다. 반면에 StringBuffer 자료형은 값을 수정해서 사용한다.
그렇다면 무조건 StringBuffer를 사용하는 것이 좋을까? 그건 상황에 따라 다르다. StringBuffer 자료형은 String 자료형보다 무겁다. new StringBuffer()로 객체를 생성하면 String을 사용할 때보다 메모리 사용량도 많고 속도도 느리다. 따라서 문자열을 추가하거나 변경하는 작업이 많으면 StringBuffer를, 적으면 String을 사용하는 것이 유리하다.
* String Builder ?
StringBuilder는 StringBuffer와 비슷한 자료형으로, 사용법도 같다.
StringBuffer는 멀티 스레드 환경에서 안전하고, StringBuilder는 StringBuffer보다 성능이 우수하다는 장점이 있다.
따라서 동기화를 고려할 필요가 없는 상황에서는 StringBuffer < StringBuilder
참고한 자료 : Ghat GPT & 박응용, 점프투자바
'Java' 카테고리의 다른 글
[Java] JDBC 오라클이랑 자바 연동 (31) | 2024.11.04 |
---|---|
[Java] ArrayList, 제네릭스(Generics), 정렬, Join, String.join 정리 (8) | 2024.11.03 |
[Java] BufferedReader / BufferedWriter (입출력 함수), StringTokenizer, split, BufferedWriter, StringBuilder (4) | 2024.10.27 |
[Java] 자바8 Stream으로 List를 map으로 변환하기 (1) | 2024.10.27 |
찾아보다가 답답해서 내가 작성한 아주 쉽게 이해하는 서블릿의 개념과 작동원리! (+그림 포함) (0) | 2024.04.24 |