Scanner와 BufferedReader

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

출처

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

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

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


Scanner VS BufferedReader

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

둘 중 코딩테스트에서는 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개의 댓글