posted by 귀염둥이채원 2019. 3. 3. 20:52

# String

- String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다.

  + 연산자 또는 concat 메서드를 사용할 경우 새로운 String 객체를 생성 --> 메모리 낭비

- 문자열 연산이 많은 경우 성능이 좋지 않다.

- synchronization(동기화) 없이도 데이터가 안전하게 공유 가능 (Thread-safe)


# StringBuffer

- mutable 가변클래스 &&  synchronization(동기화) 보장, 멀티 스레드 보장

- 문자열에 대해 변경을 시도할 경우 새로운 객체를 생성하지 않고 기존문자열을 수정하여 문자열을 변경


# StringBuilder

- mutable 가변클래스 && 단일 스레드에서만 보장

- 문자열에 대해 변경을 시도할 경우 새로운 객체를 생성하지 않고 기존문자열을 수정하여 문자열을 변경


정리하자면, 읽기용이나 공유용도로 문자열을 사용해야 한다면, String 타입을 ...

(단일 문자열 참조일 경우)


문자열 수정을 해야 하면서 멀티 스레드 환경이라면, StringBuffer를 ... 

(동기화 기능 O  -> 멀티 스레드 환경에서 안정성 보장)


문자열 수정을 해야 하면서 싱글 스레드 환경이라면, StringBuffer를 ... 

(동기화 기능 X  -> 싱글 스레드 환경에서 사용 권장)


# String/StringBuffer/StringBuilder 성능비교 포스팅 참조

https://kutar37.tistory.com/51


3개의 성능을 비교해보면 StringBuilder > StringBuffer > String 순으로 StringBuilder가 제일 빠르다.

알고리즘 문제를 푸는 경우에는 StringBuilder를 사용하자!!

StringBuffer/StringBuiler 클래스는 여러가지 문자열 조작을 위한 api를 제공한다.


# StringBuffer/StringBuiler에서 reverse()로 문자열 뒤집기가 가능하다.

StringBuilder aa = new StringBuilder("ABCDE");

System.out.printf("%s\n", aa.reverse());  --> EDCBA

System.out.printf("%s\n", aa); --> EDCBA


# 문자열 비교시 StringBuiler -> String으로 변환해서 해야함!!

Ex) if(input.toString().equals(reverse.toString())


# StringBuiler 사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package Blog;
 
public class Main {
    public static void main(String[] args) {
        // 1. 생성
        StringBuilder sb = new StringBuilder();
        
        // 2. 문자열 추가
        sb.append("안녕하세요 ");
        sb.append("오늘은").append(2).append("월 입니다.");
        System.out.println(sb);
        
        // 3. 값 원하는 위치(index)에 삽입.
        sb.insert(6"useStringBuilder!!!");
        System.out.println(sb);
        
        // 4. 삭제
        sb.delete(1113);
        System.out.println(sb);
        
        // 5. 문자열을 역순으로 만들기
        sb.reverse();
        System.out.println(sb);
    }
}
 
/********** 결과 ***************
안녕하세요 오늘은2월 입니다.
안녕하세요 useStringBuilder!!!오늘은2월 입니다.
안녕하세요 useStngBuilder!!!오늘은2월 입니다.
.다니입 월2은늘오!!!redliuBgntSesu 요세하녕안
*/
cs


# 참고사이트

https://limkydev.tistory.com/119

https://hackersstudy.tistory.com/12

https://handcoding.tistory.com/44

https://jsnote.tistory.com/22