JAVA에서 문자열을 다룰 때 대표적으로 String, StringBuffer, StringBuilder 클래스를 사용한다.
StringBuffer, StringBuilder는 String 클래스의 단점을 보완한 클래스라 생각해도 좋다.
String 클래스는 내부의 문자열을 수정할 수 없다.
String data = "Hello";
data += "world!";
문자열 결합 연산자 + 를 사용하게 되면 메모리에 새로운 객체가 생성된다.
문자열이 변경되거나 추가되면 새로운 String 객체가 생성되어 재참조된다.
아래 코드를 보면
String data = value1 + value2 + value3;
기존 생성되어 있는 객체 value1, value2, value3 => 3개
연산 후 생성되는 객체 (value1 + value2), (value1 + value2 + value3) => 2개
모든 연산 후 생성되는 객체가 모두 5개로 메모리에 생성된다.
StringBuffer, StringBuilder 클래스
- 버퍼(Buffer:데이터를 임시로 저장하는 메모리)에 문자열을 저장한다.
- 버퍼 내부에서 추가, 수정, 삭제 작업을 할 수 있다.
- 멀티 스레드환경 : StringBuffer 사용 (동기화되어 있음)
- 단일 스레드환경 : StringBuilder 사용
- 멀티 스레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하 → StringBuffer 대신 StringBuilder 사용하면 성능 향상 (동기화 여부 제외하고 두 클래스 동일하다고 봄)
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder(); // 기본적인 저장공간을 가짐
StringBuilder sb = new StringBuilder(16); // 16글자 저장될 공간을 가짐
StringBuilder sb = new StringBuilder("java"); // "Java"라는 데이터를 가진 객체 생성
// StringBuffer 객체 생성
StringBuffer sb = new StringBuffer(); // 기본적인 저장공간을 가짐
StringBuffer sb = new StringBuffer(16); // 16글자 저장될 공간을 가짐
StringBuffer sb = new StringBuffer("java"); // "Java"라는 데이터를 가진 객체 생성
메소드 | 설명 |
StringBuffer append(String str) StringBuilder append(String str) |
지정된 문자열을 이 문자 시퀀스에 추가합니다. |
StringBuffer insert(int offset, String str) StringBuilder insert(int offset, String str) |
이 문자 시퀀스에 문자열을 삽입합니다. |
StringBuffer delete(int start, int end) StringBuilder delete(int start, int end) |
이 시퀀스의 start 지점에서부터 end 지점 사이의 부분 문자열을 제거합니다. |
StringBuffer deleteCharAt(int index) StringBuilder deleteCharAt(int index) |
이 시퀀스의 지정된 위치의 문자(1개)를 제거합니다. |
StringBuffer replace(int start, int end, String str)
StringBuilder replace(int start, int end, String str) |
이 시퀀스의 start 지점에서부터 end 지점 사이의 부분 문자열을 str로 바꿉니다.
|
StringBuffer reverse() StringBuilder reverse() |
이 문자 시퀀스가 시퀀스의 역순으로 대체되도록 합니다. |
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("Java ");
sb.append("Program Study");
System.out.println(sb.toString());
// >> Java Program Study
sb.insert(4, "~!~");
System.out.println(sb.toString());
// >> Java~!~ Program Study
sb.delete(4, 6);
System.out.println(sb.toString());
// >> Java~ Program Study
sb.deleteCharAt(4);
System.out.println(sb.toString());
// >> Java Program Study
sb.replace(5, 12, "Programming");
System.out.println(sb.toString());
// >> Java Programming Study
sb.reverse();
System.out.println(sb.toString());
// >> ydutS gnimmargorP avaJ
}
}
StringBuffer
- equals()가 오버라이딩되어 있지 않다.(주소비교)
StringBuffer sb = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");
System.out.println(sb==sb2); // false
System.out.println(sb.equals(sb2)); // false
- String으로 변환 후에 equals()로 비교해야 한다.
String s = sb.toString(); // sb를 String으로 변환
String s2 = new StringBuffer("Java");
System.out.println(s.equals(sb2)); // true
'JAVA' 카테고리의 다른 글
[JAVA] BigInteger 클래스 (0) | 2022.03.24 |
---|---|
[JAVA] Comparable과 Comparator (0) | 2022.03.13 |
[JAVA] 원시타입(Primitive Type) / 참조타입(Reference Type) (0) | 2022.03.13 |
[JAVA] StringTokenizer 클래스 (0) | 2022.01.20 |
[JAVA] Scanner와 BufferedReader/BufferedWriter (0) | 2022.01.19 |
댓글