취지 및 결론
1. 취지
: Stirng, StringBuilder, StringBuffer를 각각 사용할 때마다 메모리와 속도가 다르다.
왜 그럴까 궁금하기도 하고, 어떤게 더 효율적인지 알아두고 쓰는게 좋을거 같아 조사했다.
2. 결론
: 일반 String으로 연산 => 제일느리지만, 불변 밸류 (연산적고 읽기가 많을때 권장)
: StringBuilder => 단일 스레드에서 빠름 (시퀀스 방식)
: StringBuffer => 멀티 스레드에서 빠름
차이
: String 단순 연산은 불변 밸류(Immutable)f라는 특성이 있기 때문에 느리다.
즉, 값이 한번 설정되면 변경될 수 없는데, 그렇기 때문에 우리 눈에 같은 문자열에 값을 추가하는 것처럼 보이지만,
사실상 new String으로 새로운 인스턴스를 생성해주는 과정이 있어, 엄연히 다른 메모리 주소를 갖게 되는 것이다.
즉, 연산마다 새로운 인스턴스를 생성해주기 때문에 메모리나 속도를 많이 잡아먹는다는 소리다.
대신, String 단순 연산 사용은 Immutable value라는 성질에 의해 값이 변경되지 않아 여러 스레드가 데이터를 공유하더라도 데이터의 안정성이 보장된다는 장점이 있다.
또한, StringBuffer와 StringBuilder클래스 모두 결국 String클래스를 이용한다. 따라서, 연산이 적게 사용되고, 문자열 값의 수정 없이 읽기가 많은 경우에는 String 클래스 사용이 더 적절하다.
: StringBuffer는 동기화를 지원하기 때문에 멀티 스레드 환경에서 안전하게 동작하지만, StringBuilder는 동기화를 지원하지 않는다. 이 때문에 StringBuffer는 멀티 스레드 환경에서, StringBuilder는 단일 스레드 환경에서 권장된다.
참고 자료 링크 : https://cjh5414.github.io/why-StringBuffer-and-StringBuilder-are-better-than-String/
사용 방법
: 입력방식의 경우, 꼭 둘중 하나만 사용하는 것이 아니라, Scanner나 BufferReader 중 하나 선택해서 쓰고,
필요시 StringTokenizer로 한 줄에 담긴 String중 원하는 단위로 하나씩 뽑아 쓰면 된다.
1. 입력 (BufferReader + StringTokenizer)
: BufferReader의 readLine()으로 한 줄씩, StringTokenizer로 한 단어씩 뽑아쓰는 방법
// 읽기전용 버퍼
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력내용 뽑아오기: String으로만 가져옴
br.readLine();
// String 입력 한 글자씩 뽑아오는 방법
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// StringBuilder 생성
StringBuilder sb = new StringBuilder();
2. StringBuilder
// 문자열 추가
sb.append("붙이길 원하는 문자열");
// 문자열 출력
System.out.println(sb);
3. StringBuffer
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 문자열 입력 방법1
bw.write("원하는 문자열 입력" + "\n");
// 문자열 입력 방법2
bw.append("원하는 문자열" + "\n");
// 출력방법 1: 스트림을 닫지않고 출력만
bw.flush();
// 출력방법 1: 스트림을 닫기전에 출력 후 닫음
bw.close();'Java & Spring > Java' 카테고리의 다른 글
| [VS Code] VS Code에서 Java 사용 세팅 (0) | 2023.05.09 |
|---|---|
| [자바문법] BFS || DFS || PriorityQueue 공식 정리 (0) | 2023.03.02 |
| [문법] Java문법 : Map & Entry 사용하기 (0) | 2023.03.02 |