목차
입력 클래스
1. Scanner
- System.in
- InputStream
2. BufferedReader
- InputStreamReader
- ReaderStream
3. StringTokenizer
출력 클래스
1. System.out.println()
2. BufferedWriter
3. StringBuilder
입력 클래스
속도 : StringTokenizer >> BufferedReader >> Scanner
1. Scanner
패키지 : java.util
Scanner 클래스는 생성자로 전달되는 대상으로부터 데이터를 추출하는 기능을 제공하는 클래스이다.
띄어쓰기와 개행문자를 경계로 입력 값을 인식하며, 버퍼 사이즈가 1024 char이기 때문에 많은 입력을 필요로 할 경우에는 비효율적이다.
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long l = sc.nextLong();
String s = sc.next();
String s = sc.nextLine();
System.in
키보드와 같은 사용자로부터 입력을 받는 표준 입력스트림 객체이며, 반환값은 InputStream이다.
InputStream
또한, InputStream은 입력 스트림으로부터 데이터를 byte 단위로 읽어오는 byte stream이다.
2. BufferedReader
BufferedReader는 인자로 취한 ReaderStream에 버퍼링 기능을 추가한 입력 스트림 클래스이다.
또한, 버퍼를 통해 데이터를 사용자가 요청할 때마다 읽어오는 것이 아니라, 버퍼에 보관 후 사용자가 요청 시 읽어오므로 시간의 부하를 줄일 수 있다.
Scanner와 달리 BufferedReader는 개행문자만 경계로 인식하고 readLine() 메소드를 제공한다. 따라서 입력받은 데이터는 String으로 고정되어 형변환이 필요하다.
만약 공백 단위로 데이터를 가공하려면 String.split()나 StringTokenizer를 사용해야 한다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
int i = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" "); // 1 2 3 4 5 한 줄 입력 시 s[0]="1", s[1]="2", ...
InputStreamReader
인자로 InputStream을 취해서 ReaderStream 형태로 변환한다.
변환 시 문자열 인코딩을 줄 수 있다.
ReaderStream
InputStream과 달리 입력스트림에서 데이터를 char 단위로 처리한다.
3. StringTokenizer
StringTokenizer는 BufferedReader와 함께 사용한다.
StringTokenizer의 nextToken() 메소드는 단순히 공백자리를 땡겨 채워준다.
// AAA BB CCC DD 입력 시
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String A = st.nextToken(); // "AAA"
String B = st.nextToken(); // "BB"
String C = st.nextToken(); // "CCC"
String D = st.nextToken(); // "DD"
split() 메소드는 정규식 기반으로 자르는 메소드라 내부구조가 복잡하다.
따라서 nextToken() 메소드는 단순히 공백자리를 땡겨 채우기 떄문에 속도가 훨씬 빠르다.
즉, 공백을 기준으로 자르는 경우에는 StringTokenizer의 nextToken() 메소드를 사용하는 것이 효율적이다.
출력 클래스
속도 : BufferedWriter, StringBuilder >> System.out.println()
1. System.out.println()
2. BufferedWriter
BufferedWriter는 System.out.println()와 달리 출력과 개행을 동시에 해주지 않기 때문에, 개행을 위해선 newLine() 혹은 bw.write("\n")을 사용해야 한다. 또한, BufferedWriter는 버퍼를 사용하기 때문에 flush()와 close()를 사용해야 한다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = "abcdef";
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
| close() | flush() 이후에 스트림을 닫는다. |
| flush() | 스트림을 비운다. |
| newLine() | 개행 문자 역할을 한다. |
| write(char[] buf, int offset, int length) | 버퍼 offset 위치부터 length 크기만큼 출력한다. |
| write(int c) | 한 글자를 출력한다. |
| write(String s, int offset, int length) | 문자열에서 offset에서부터 일정 길이만큼 출력한다. |
3. StringBuilder
String vs StringBuffer/StringBuilder
| String | 불변 속성을 가진다. 따라서 따라서 문자열 추가, 삭제, 수정 등의 연산이 자주 일어나는 경우에 String을 사용하면, 힙 메모리에 많은 Garbage가 생성되고, 프로그램의 성능에 좋지 않다. |
| StringBuffer/StringBuilder | 불변 속성을 가지지 않는다. 따라서 문자열 연산이 자주 일어나는 경우에 적합하다. |
StringBuffer vs StringBuilder
| StringBuffer | 동기화를 지원하여 멀티 스레드 환경에서 안전하다. |
| StringBuilder | 동기화를 지원하지 않아 멀티 스레드 환경에 사용하기 적합하지 않다. 대신 단일 스레드에서는 StringBuffer보다 성능이 뛰어나다. |
결론적으로 문자열의 연산이 자주 일어나는 단일 스레드 환경에선 StringBuilder를 사용하는 것이 유리하다.
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b").append(" ");
sb.append("c").append("\n");
System.out.println(sb);
| StringBuilder append(String s) | 뒤에 문자열을 추가한다. |
| StringBuilder delete(int start , int end) | 특정 인덱스부터 인덱스까지 삭제한다. |
| StringBuilder insert(int offet, any primitive of a char[]) | 문자를 삽입한다. |
| StringBuilder replace(int start , int end , String s) | 일부를 String 객체로 치환한다. |
| StringBuilder reverse() | 순서를 뒤집는다. |
| StringBuilder setCharAt(int index , char ch) | 주어진 문자를 치환한다. |
| StringBuilder indexOf(String s) | 값이 어느 인덱스에 들어있는지 확인한다. |
| StringBuilder subString(int start, int end) | start와 end사이의 값을 잘라온다. |
[Java] 코딩테스트를 위한 입력 클래스 활용하기
들어가기 전자바에는 다양한 입력 클래스들이 있다.
sangwoo0727.github.io
Java 입출력, BufferedReader, StringTokenizer · Codinfox Lanyon
BufferedReader를 사용했을시, 92MS로 처리속도 단축.
wkimdev.github.io
[Java] 빠른 입출력을 위한 BufferedReader, BufferedWriter, StringTokenizer, StringBuilder
BufferedReader / BufferedWriter BufferedReader와 BufferdWriter는 버퍼를 사용하여 읽기와 쓰기를 하는 함수이다. 버퍼를 사용하지 않는 입력은, 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.
rlakuku-program.tistory.com
'Language > Java' 카테고리의 다른 글
| [effective java] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라. (0) | 2023.03.02 |
|---|---|
| [effective java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. (0) | 2023.03.02 |
| [effective java] 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라. (0) | 2023.03.01 |
| [effective java] 아이템 6. 불필요한 객체 생성을 피하라. (0) | 2023.03.01 |
| [effective java] 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라. (0) | 2023.03.01 |