String | StringBuffer | StringBuilder
코테 문제를 풀다보니 여러가지 해설을 보게 되는데,
StringBuilder랑 StringBuffer가 자주 등장하는데 하나도 모르겠어서
정리해보고자 했다.
찾다보니 String이란 클래스 자체가 자바에선 중요한 역할..? 특별한 클래스라고 생각된다.
여태 그냥 스트링은 스트링이지~ 이러고 썼는데.. ㅠㅡㅠ 어려운 녀석이었다.
하나씩 살펴보자
1. String클래스 ** 중요함! **
- immutable (변경 불가능한) 클래스
- 읽어 올 수만 있고, 변경할 수는 없다.
- String문자열을 저장하기 위해서 문자형 배열 참조변수(char[]) value를 인스턴스 변수로 정의한다.
즉 ..! String 인스턴스를 생성할 때 이 value에 문자형 배열로 저장된다는 것.
* The value is used for character storage.
> 직접 찾아봤더니 byte[] 배열로 되어있는데 사실은 character storage를 위해 사용된다고 한다.
- '+' 연산자를 이용해 문자열을 결합한다면 ? 인스턴스 내 문자열 value가 바뀌는 것이 아닌, 새로운 String 인스턴스가 생성되는 것! == 즉, 메모리 공간이 새롭게 생긴다는 뜻.
>> 이럴 때 String 클래스 대신 사용하는 것이 StringBuffer or StringBuilder.
- String 클래스 메서드
- 생성자
생성자 | 설명 |
String(String s) | 주어진 문자열(s)을 갖는 String 인스턴스 생성 |
String(char[] value) | 주어진 문자열(value)을 갖는 String 인스턴스 생성 |
String(StringBuffer sb) | StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String 인스턴스 생성 |
- 메서드
char charAt(int index) | 지정된 위치(index)에 있는 문자를 알려줌 |
int compareTo(String str) | 문자열(str)과 사전순으로 비교. 같으면 0 / 사전순으로 이전이면 음수 / 사전순으로 이후면 양수 반환 |
String concat(String str) | 문자열(str)을 뒤에 덧붙임 |
boolean contains(CharSequence s) | 지정된 문자열(s)이 포함되었는지 검사 |
boolean endsWith(String s) | 지정된 문자열(s)로 끝나는지 검사 |
boolean equals(Object obj) | 매개변수로 받은 문자열(obj)과 String 인스턴스의 문자열을 비교. obj가 String이 아니거나, 문자열이 다르면 false |
boolean equalsIgnoreCase(String str) | 문자열과 String의 인스턴스의 문자열을 대소문자 구분 없이 비교. |
int indexOf(int ch) | 주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치(index)를 알려줌. 못찾으면 -1을 반환. (인덱스는 0부터 시작) |
int indexOf(int ch, int pos) | 주어진 문자(ch)가 문자열에 존재하는지 확인하는데, 지정된 위치(pos)부터 확인. 못찾으면 -1 반환 (인덱스 0부터 시작) |
int indexOf(String str) | 주어진 문자열이 존재하는지 확인하여 인덱스 알려줌 없으면 -1 반환 (인덱스 0부터 시작) |
String intern() | 문자열을 상수풀(constant pool)에 등록. (이때 이미 상수풀에 같은 내용의 문자열이 있을 경우 그 문자열의 주소값을 반환) |
int lastIndexOf(int ch) | 지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아서 인덱스를 알려줌. 못찾으면 -1 반환 |
int lastIndexOf(String str) | 지정된 문자열을 인스턴스의 문자열 오른쪽 끝에서부터 찾아서 인덱스를 알려줌. 못찾으면 -1 반환 |
int length() | 문자열의 길이를 반환 |
String replace(char old, char new) | 문자열 중의 문자(old)를 새로운 문자(new)로 변환 |
String replaceAll(String regex, String replacement) | 문자열 중에서 지정된 문자열(regex)과 일치하는 것을 새로운 문자열로 모두 변경 |
String replaceFirst(String regex, String replacement) | 문자열 중에서 지정된 문자열(regex)과 일치하는 것 중 첫번째 것만 새로운 문자열로 변경 |
String[] split(String regex) | 문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환 |
String startsWith(String prefix) | 주어진 문자열(prefix)로 시작하는지 검사 |
String substring (int begin) String substring(int begin, int end) |
주어진 시작위치(begin)부터 끝 위치(end)까지 포함된 문자열을 얻음. (begin <= x < end) end는 포함되지 않음. |
String toLowerCase() String toUpperCase() |
모든 문자열을 소문자/대문자로 변환하여 반환 |
String trim() | 문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환 |
String valueOf(boolean b) String valueOf(char c) String valueOf(int i) String valueOf(long l) String valueOf(float f) String valueOf(double d) String valueOf(Object o) |
지정된 값을 문자열로 변환하여 반환. |
2. StringBuffer
- mutable(가변) 클래스
- 변경/추가가 가능!
- 내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있음!
- 편집할 문자열의 길이를 고려하여 버퍼의 크를 충분히 잡아주는 것이 좋다....!! (편집하다가 길이를 늘여주려면 작업 효율이 떨어진다ㅜㅜ)
- 버퍼의 기본 크기는 지정하지 않으면 16개의 문자 저장할 수 있는 크기. (생성자를 통해 크기 별도 설정 가능)
- 멀티쓰레드에 안전(thread safe)하도록 동기화.
public StringBuffer(String str) {
this(str.length() + 16);
append(str);
}
- 변경 방법 : append() 메서드 사용
반환 값이 StringBuffer이며 자신의 주소를 반환하기 때문에 sb, sb2의 값이 모두 같다.
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
StringBuffer sb2 = sb.append("456");
System.out.println(sb); // 출력 : abc123456
System.out.println(sb2); //출력 : abc123456
- 비교 방법 : toString() 과 equals() 사용.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb==sb2); // 결과값 false
System.out.println(sb.equals(sb2)); //결과값 false
System.out.println(sb.toString().equals(sb2.toString()); // 결과값 true
- StringBuffer 클래스 메서드
- 생성자
생성자 | 설명 |
StringBuffer() | 16문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성 |
StringBuffer(int length) | 지정된 개수의 문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성 |
StringBuffer(String str) | 지정된 문자열 값(str)을 갖는 StringBuffer 인스턴스 생성 |
- 메서드
StringBuffer append(boolean b) StringBuffer append (char c) StringBuffer append (char[] str) StringBuffer append (int i) StringBuffer append (long l) StringBuffer append (float f) StringBuffer append (double d) StringBuffer append (Object o) StringBuffer append (String str) |
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer 인스턴스가 저장하고 있는 문자열의 뒤에 덧붙임 |
int capacity() | StringBuffer 인스턴스의 버퍼크기를 알려줌. |
int length() | 버퍼 인스턴스에 담긴 문자열의 길이를 알려줌 |
char charAt(int index) | 지정된 위치에 있는 문자를 반환. |
StringBuffer delete(int start, int end) | 시작위치부터 끝 위치 사이에 있는 문자 제거. (끝 문자 미포함) |
StringBuffer deleteCharAt(int index) | 지정된 위치의 문자를 제거. |
StringBuffer insert(int pos, boolean b) StringBuffer insert(int pos, char c) StringBuffer insert(int pos, char[] str) StringBuffer insert(int pos, int i) StringBuffer insert(int pos, long l) StringBuffer insert(int pos, float f) StringBuffer insert(int pos, double d) StringBuffer insert(int pos, Object o) StringBuffer insert(int pos, String str) |
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가. pos는 0부터 시작 |
StringBuffer replace(char old, char new) | 문자열 중의 문자(old)를 새로운 문자(new)로 변환 |
StringBuffer reverse() | StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열. |
void setCharAt(int index, char ch) | 지정된 위치의 문자를 주어진 문자로 바꿈. |
void setLength(int newLength) | 지정된 길이로 문자열의 길이를 변경. 길이를 늘리는 경우 나머지 빈 공간을 널문자 '\u0000'로 채움. |
String toString() | StringBuffer 인스턴스의 문자열을 String으로 반환 |
String substring (int begin) String substring(int begin, int end) |
지정된 범위 내의 문자열을 String으로 뽑아서 반환. 시작위치만 주어지면 시작위치부터 문자열 끝까지 뽑아서 반환. |
3. StringBuilder
- StringBuffer에서 쓰레드의 동기화만 뺀 클래스
- 단일쓰레스에서의 성능은 StringBuffer보다 뛰어남.
- 성능향상이 반드시 필요한 경우를 제외하고는 굳이 바꿀 필요는 없음.
- 메서드는 StringBuffer와 같다.
<String / StringBuffer / StringBuilder 비교>
String | StringBuffer | StringBuilder | |
가변성 | 불변 | 가변 | 가변 |
연산 속도 | 느림 | 빠름 | 아주빠름 |
사용 시점 | 문자열 추가 연산이 적고, 스레드 세이프 환경 | 문자열 추가 연산이 많고, 스레드 세이프 환경 | 문자열 추가 연산이 많고, 빠른 연산이 필요한 경우 단일 스레드 환경일 경우 |
* 현업에서는 자바 어플리케이션이 대부분 멀티 스레드 환경에서 돌아가기 때문에 ~ StringBuffer로 통일하여 코딩하는 것이 좋다고 한다.
'Programming > Java' 카테고리의 다른 글
JShell (0) | 2023.12.14 |
---|---|
프로그래밍을 통한 문제해결 (2) | 2023.12.13 |
File I/O (1) | 2023.12.03 |
Stream API (1) | 2023.11.30 |
제너릭 (Generics) (1) | 2023.11.29 |