· scanner / System.out.print 보다 속도 빠른 BufferedReader / BufferedWriter / StringBuilder
· 문자열을 분리해주는 StringTokenizer / split
scanner 을 이용한 입력 :
- 입력시 바로 처리하는 방식 - 속도 느림.
- 짧은 입력에 추천. 많은 입력에는 비추 (버퍼 사이즈가 1024byte임)
- 공백과 개행문자 기준으로 읽음
■ BufferedReader 을 이용한 입력 :
>> BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
버퍼에 쌓아두고 한 번에 처리하는 방식
- scanner보다 속도 빠름.
- String 타입으로만 읽을 수 있음.
- 예외처리 명시해야 함.(throws IOExeption 또는 try/catch문 사용)
- java.io 패키지
- 메모리 사용량 큼. 많은 입력에 추천 (버퍼사이즈 8192byte)
- 개행문자 기준으로 읽음.
- 스레드 간 동기화 가능
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine(); // 문자열 읽어오기
int n = Integer.parseInt(br.readLine()); // 읽어와서 데이터 가공
br.close();
}
▷ readLine() 메소드 이용해 읽어옴
▷ close() 해주는게 좋음
▷ StringTokenizer나 split 이용해 문자열 분리
■ StringTokenizer 을 이용한 문자열 분리 :
- 문자열을 공백 단위(디폴트)로 분리.
- java.util 패키지 (java.util.StringTokenizer)
▽ StringTokenizer(String str) : 기본 구분자로 문자열 분리
StringTokenizer st = new StringTokenizer(br.readLine());
▽ StringTokenizer(String str, String delim) : 지정 구분자(delim)로 분리
StringTokenizer st = new StringTokenizer(br.readLine(), "-"); // "-" 기준 분리
▽ StringTokenizer(String str, String delim, boolean tf) : true이면 구분자도 토큰으로 인식. (디폴트는 false)
StringTokenizer st = new StringTokenizer(br.readLine(), " ", true);
// ex) "Hello World!" --> "Hello", " ", "World!"
▽ 주요 메소드:
· nextToken() : 다음 토큰 리턴
· countTokens() : 남은 토큰의 개수 리턴
· hasMoreTokens() : 리턴할 다음 토큰이 있는지 여부 리턴
import java.io.*;
import java.util.StringTokenizer;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String s = st.nextToken(); // 다음 토큰 리턴
int n = st.countTokens(); // 남은 토큰 개수 리턴
boolean tf = st.hasMoreTokens(); // 남은 토큰 존재 여부 리턴
br.close();
}
■ split 을 이용한 문자열 분리 :
- 문자열을 분리해 배열로 리턴함
▽ split(String delim) : 구분자(delim)로 문자열 분리
- 여러개의 구분자로 문자열 분리 : 대괄호로 구분자들 감싸기. ex) split("[$@#]") --> 구분자: $, @, #
String [] str = br.readLine().split(" "); // 공백으로 문자열 분리
String [] str = br.readLine().split("[# %&]"); // #, 공백, %, &으로 문자열 분리
▽ split(String delim, int n) : 구분자(delim)로 문자열 분리. 단, n번만 분리
String [] str = br.readLine().split(" ",3);
// "1 2 3 4 5" --> "1", "2", "3 4 5"
System.out.print 를 이용한 출력:
- 출력을 바로바로 처리 - 속도 느림
■ BufferedWriter 을 이용한 출력:
>> BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
버퍼에 모아놨다가 한번에 처리
- system.out.print보다 속도 빠름
- 스레드 간 동기화 가능 - 멀티스레드에 적합
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
public static void main(String [] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("Hello");
bw.flush();
bw.close();
}
△ write(String s, int off, int len) : 문자열 s를 off위치부터 len길이만큼 버퍼에 저장
* 버퍼에 저장되는 것이므로, 출력하려면 flush()해줘야 함
* 숫자 출력 시, String형으로 변환 후 출력하기 ex) bw.write(5 + "");
△ newLine() : 줄바꿈문자 출력
△ flush() : 남아있는 데이터 모두 출력시키기
△ close() : 스트림 닫기
■ StringBuilder 을 이용한 출력:
>> StringBuilder sb = new StringBuilder();
- StringBuilder을 이용해 문자열 저장 후, System.out.print()를 이용해 한번에 출력하는 방법으로 시간절약을 할 수 있음.
- 기존 문자열에 더하는 방식으로 시간절약.(String에 문자열을 더하는 방식은 객체를 새로 만들어야 해서 시간소요 up)
- 스레드 간 동기화가 불가능해 단일 스레드에 적합.
- 메소드는 String클래스 메소드와 같음. (append, delete, insert, charAt, length...)
StringBuilder sb = new SringBuilder();
sb.append("abc");
sb.append("def").append("gh");
System.out.println(sb);
'개념 정리 > Java' 카테고리의 다른 글
[JAVA] 네트워크, 소켓통신 (2) | 2024.01.07 |
---|---|
[JAVA] 스레드 (1) | 2023.10.31 |
[JAVA] 그래픽 (1) | 2023.10.26 |
[JAVA] 스윙 컴포넌트(JLabel, JButton, JCheckBox, JRadioButton, JTextField, JList, JComboBox) (0) | 2023.10.26 |
[JAVA] 이벤트, 리스너, key 이벤트, 마우스 이벤트 (0) | 2023.10.25 |