String | StringBuffer | StringBuilder

2023. 12. 4. 23:24
728x90

코테 문제를 풀다보니 여러가지 해설을 보게 되는데,

StringBuilder랑 StringBuffer가 자주 등장하는데 하나도 모르겠어서 

정리해보고자 했다.

 

찾다보니 String이란 클래스 자체가 자바에선 중요한 역할..? 특별한 클래스라고 생각된다.

여태 그냥 스트링은 스트링이지~ 이러고 썼는데.. ㅠㅡㅠ 어려운 녀석이었다.

 

하나씩 살펴보자 

 

1. String클래스 ** 중요함! **

  • immutable (변경 불가능한) 클래스
  • 읽어 올 수만 있고, 변경할 수는 없다.

- String문자열을 저장하기 위해서 문자형 배열 참조변수(char[]) value를 인스턴스 변수로 정의한다.

즉 ..! String 인스턴스를 생성할 때 이 value에 문자형 배열로 저장된다는 것.

java String class

* 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로 통일하여 코딩하는 것이 좋다고 한다.

 

 

 


728x90

'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

BELATED ARTICLES

more