본문 바로가기
Java

[Java] 입력 - Scanner, BufferedReader

by ete-llorona 2023. 1. 7.

올해부터 자바 공부를 시작하면서, 백준 알고리즘 문제도 자바로 풀어보면 좋을 것 같았다.

 

첫 난관은 입력값을 받는 문제였다.

 

입력은 Scanner 또는 BufferedReader 객체로 받을 수 있다.

첫 선택은 Scanner 였다.

 

 

1. Scanner

 

파이썬은 입력을 받으면 문자열이지만, 자바는 Scanner 객체로 받게 된다.

 

그래서 Scanner 객체를 기본(원시 primitive) 타입으로 바꾸는 작업이 필요하다.

Scanner로 받은 객체는 nextInt()int를, next()String를 받을 수 있다.

 

그리고 nextInt(), next()는 공백을 기준으로 값을 입력 받는 반면,

nextLine()은 개행을 기준으로 값을 입력받는다.

 

import java.util.Scanner;

public class InputExample1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int number = scanner.nextInt(); // 정수, 공백 기준
        //String str1 = scanner.next(); // 문자열, 공백 기준
        //String str2 = scanner.nextLine(); // 문자열, 개행 기준

    }
}

 

Scanner는 사용법이 쉽지만, 알고리즘 문제를 풀 때는 주로 BufferedReader 를 많이 쓴다.

왜냐하면 빠르기 때문이다.

(BufferedReader는 문자열을 그대로 읽으므로 별다른 정규식 검사 과정이 없기 때문에 Scanner보다 성능이 우수하다)

 

참고: https://st-lab.tistory.com/41

 

 

 

2. BufferedReader

 

BufferedReader를 사용하려면, main 메소드에서 IOException 예외를 선언해야 한다.

Scanner 와 달리 BufferedReader는 문자열 그대로 읽기 때문에

행 단위로 문자열을 받는 readLine()을 이용해야 한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputExample2 {
    public static void main(String[] args) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str = reader.readLine();

        System.out.println(str);
    }
}

 

공백 단위로 입력 값이 들어오기 때문에 문자열을 분리하는 작업을 따로 진행해야 한다.

문자열 분리는 split() 또는 StringTokenizer를 이용한다.

 

 

3. 문자열 분리 - split

 

split(" ")으로 공백을 기준으로 구분하면 문자열 배열을 반환한다.

 

public class InputExample3 {
    public static void main(String[] args) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str = reader.readLine();
        String[] strings = str.split(" ");
        for(String string : strings) {
            System.out.println(string);
        }
    }
}

 

split()의 두번째 인자는 배열의 크기를 결정한다.

즉, split(" ", 2)로 입력하면, 첫번째 공백을 기준으로 문자열을 구분한 뒤 크기 2인 배열에 담아서 반환하게 된다.

 

 

 

4. 문자열 분리 - StringTokenizer

 

StringTokenizer를 사용하면 nextToken()으로 문자열을 구분자 기준으로 값을 받아올 수 있다.

 

public class InputExample4 {
    public static void main(String[] args) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str = reader.readLine();
        StringTokenizer tokenizer = new StringTokenizer(str, " "); // 두번째 인자는 구분자 
        String string1 = tokenizer.nextToken();
        int number1 = Integer.parseInt(tokenizer.nextToken());
        System.out.println(string1);
        System.out.println(number1);
    }
}

 

위의 예시에서는 한 행에 공백을 기준으로 앞에는 문자열, 뒤에는 정수인 입력 값을 받을 때,
공백을 기준으로 값을 받아온 뒤, 두번째 인자는 정수로 parsing 하여 정수형으로 변환하면 된다.

'Java' 카테고리의 다른 글

[Java] 묵시적 형변환, 명시적 형변환  (0) 2023.01.08

댓글