BufferedReader는 Java.io에 속하는 입력 클래스로, Scanner에 비해 처리 속도가 빠르다.
때에 따라 2배 이상 차이 나는 경우도 있다.
알고리즘 문제를 풀 때 유용할 것!!
Scanner
Scanner sc = new Scanner(System.in);
String str = sc.next(); // 문자열 입력받기
int i = sc.nextInt(); // 정수 입력받기
long l = sc.nextLong(); // long타입 입력받기
BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(Syste.in));
String s = br.readLine(); // 문자열 입력받기
int i = Integer.parseInt(br.readLine()); // 정수 입력받기
주의사항
- readLine()으로 입력받으면 리턴값이 무조건 String이다. 따라서, 다른 타입으로 입력을 받으려면 형변환이 필요하다.
- 예외처리를 해주어야 한다. throws IOException을 사용한다.
import java.io.*;
public static void main(String[] args) throws IOException {
}
StringTokenizer
StringTokenizer는 java.util 패키지에 속한 문자열 파싱(parsing)을 위한 정보를 제공하는 클래스이다.
파싱하고자 하는 문자열을 인자로 받아서 생성하는데, 여기서 파싱은 하나의 문자열을 여러 문자열로 분할하는 작업을 의미한다. 이때 분할하는 단위가 되는 문자열을 토큰(token)이라고 한다.
쉬운 말로 설명하자면, 문자열 "a b c d e"를 공백 기준으로 나누고 싶다면, "a b c d e"를 StringTokenizer의 인자로 넣어주면 된다. 그리고 이때는 분할 기준이 공백이기 때문에, 공백 == 토큰이 되는 것이다.
readLine()으로 입력받은 데이터를 공백 단위로 가공하기 위해서는 StringTokenizer를 사용한다.
예를 들어, "5 4 3 2 1"을 문자열로 입력받고, 공백 기준으로 분리하여 각각의 숫자를 배열에 저장하고 싶다.
이때, BufferedReader와 StringTokenizer를 사용하면 좋다!
구분자를 기준으로 문자열을 분리하는 방법에는 String.split() 도 있다. split() 메소드는 정규 표현식으로 구분하고, StringTokenizer는 문자로 구분한다는 차이점이 있다.
아래 코드를 주석과 함께 천천히 살펴보면 이해가 쉬울 것이다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine(); // hi~ 입력
System.out.println(str); // hi~ 출력
StringTokenizer st = new StringTokenizer(br.readLine()); // 123 456 입력
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// # st의 token이 다 꺼내졌으므로 st는 비어있다.
System.out.println(N); // 123 출력
System.out.println(M); // 456 출력
st = new StringTokenizer(br.readLine(), ","); // 56,67,89 입력
int i = Integer.parseInt(st.nextToken());
int j = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
// # st의 token이 다 꺼내졌으므로 st는 비어있다.
System.out.println(i); // 56 출력
System.out.println(j); // 67 출력
System.out.println(k); // 89 출력
nextToken()
nextToken()은 토큰을 하나씩 꺼내는 메소드이다. 이때 주의할 점은, nextToken()으로 토큰을 하나 꺼내면 StringTokenizer 객체에서는 해당 토큰이 제거된다. 만약 StringTokenizer 객체가 비어서 더 이상 가져올 토큰이 없으면 java.util.NosuchElementException 예외가 발생된다.
Reference
https://kephilab.tistory.com/99
'Java > 문법' 카테고리의 다른 글
[JAVA 중급 스터디 - 1회차] 기본형/참조형, Wrapper Class생성자, 패키지 (0) | 2024.03.08 |
---|---|
[Java] 배열의 공통 원소 집합 구하기 (0) | 2024.03.02 |
[Java 문법 총정리] final (1) | 2024.01.27 |
[Java 문법 총정리] 문자열 ↔ 숫자 형변환 / int ↔ char (0) | 2024.01.27 |
[Java 문법 총정리] 상수 집합 enum (1) | 2024.01.27 |