Scanner와 BufferedReader

드코미·2025년 7월 17일
post-thumbnail

출처

나는 학생때 딱 한번 JAVA수업을 들은적이 있는데...
그때, 과제를 Scanner로 했던 기억밖에 없다.

그래서 Scanner로 주섬주섬 문제를 풀려고 했는데!!!
다른 사람들 풀이를 봤더니 다 BufferedReader로 되어있길래
함께 공부하는 동료분들께 물어봤다..
그런데.. Scanner 실제로 안쓴단다..

그래서 유튜브나 글에 자료들을 모으면서 둘의 차이를 파악해보려고 한다.


Scanner VS BufferedReader

자바로 코딩테스트에서 입력 데이터를 받는 방법은 ScannerBufferedReader가 있습니다.

둘 중 코딩테스트에서는 BufferedReader가 더 좋습니다.
왜냐면 바로 제한시간 때문이에요.

코딩테스트에서는 대부분 제한시간을 주기 때문에 입력 데이터를 받는 시간도 적게 걸리는 것이 중요합니다.

만약 Scanner로 데이터를 받는 시간이 노란색 표시만큼이라면, BufferedReader는 초록색 표시만큼이다.

=> 시간초과가 발생했을 때, 내가 Scanner를 썼다면 한번쯤 의심해볼 필요가 있다!

두 입력 방식 비교

Input Data

1 2 3

(1) Scanner

Scanner sc = new Scanner(System.in);

int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();

Scanner의 경우는 Scanner 객체를 생성하고
nextInt()라는 함수를 사용하여 간단하게 3개의 변수에 데이터를 저장할 수 있습니다.

(2) BufferedReader

반면에 BufferedReader는, BufferedReader 객체를 생성하고 그 안에 InputStreamReader 객체도 함께 생성해 주어야 합니다.

/*
	*  ✅ BufferedReader: 줄 단위로 입력을 빠르게 읽으려는 목적
	*  System.in은 입력을 받지만 바이트로 읽어서 바로 읽기는 불편합니다.
	*  따라서 InputStreamReader로 바이트를 문자 스트림으로 바꿔줌으로써, 문자로 입력을 받을 수 있게 됩니다.
	*  InputStreamReader로 래핑된 입력을 버퍼에 모아서 한 번에 읽습니다.
*/
         
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

/*
    * ✅ br.readLine()
    * 한 줄을 통째로 문자열(String)로 읽어옵니다.
    * 만약에 현재 한 줄에 1 2 3 입력 --> br.readLine()의 결과는 "1 2 3"
*/
/*
	* ✅ StringTokenizer: 문자열을 공백이나 특정 구분자로 나누기 위해 사용되는 클래스
	* "1 2 3"이라는 입력 문자열을 공백 기준으로 즉석에서 잘라냄.
    * st.nextToken()을 호출할 때마다 문자열을 앞에서 잘라서 하나의 토큰을 반환하고, 내부 포인터는 다음 위치로 이동함.
    * st.nextToken()으로 호출할 때마다 맨 앞의 토큰을 하나씩 꺼내서 리턴
    * 결론적으로 토큰은 "1", "2", "3"가 있음.
    * 한 번 꺼낸 토큰은 다시 못 씀! 
*/
StringTokenizer st = new StringTokenizer(br.readLine());

int a = Integer.parseInt(st.nextToken());  // 토큰 "1" 리턴 --> int형으로 바꾸기
int b = Integer.parseInt(st.nextToken());  // 토큰 "2" 리턴 --> int형으로 바꾸기
int c = Integer.parseInt(st.nextToken());  // 토큰 "3" 리턴 --> int형으로 바꾸기
  • Scanner에 비하면 꽤 복잡하지만, 그럼에도 불구하고 BufferedReader가 더 빠릅니다.
  • 입력 데이터가 적다면 둘 다 사용해도 되긴 하는데, 입력 데이터가 많다면 BufferedReader 사용해 주세요.

⚠️ 권장 사항 - BufferedReader()

가끔 코테 입력에서 입력 끝에 공백이 있는 경우가 있습니다.
예를 들어서 "1 2 3"이 들어온다고 생각했는데, "1 2 3 "이렇게 되어있다면 예상치못하게 돌아가지 않는 상황이 발생할 수 있습니다.

따라서, 그런 불상사를 막기 위해서, br.readLine()을 할 때, 꼭 양쪽 공백을 제거해주는 trim()을 함께 사용합시다.

br.readLine().trim()
profile
할 수 있다!!!

0개의 댓글