본문 바로가기
DevelopmentTools/Java

[java] 입력받는 방법 2가지

by 수짱수짱 2023. 2. 10.

Java가 사용자로부터 입력받는 방법으로 크게 2가지가 있다

 

1. Scanner

Scanner는 자료형이 자동으로 정해지기 때문에 입력받을 때 따로 형 변환을 할 필요가 없다.

공백과 줄바꿈을 모두 경계로 인식해서 입력을 받을 때 매우 용이하다.

이러한 편리함 때문에 대부분 입력을 받을 때 Scanner를 이용한다.

 

Scanner 클래스를 사용하기 위해서는 import가 필요하다.

Scanner 객체의 인자로는 System.in이 필요하다.

 

System.in은 InputStream의 객체이다.

이때, InputStream은 콘솔 입력을 뜻한다.

import java.util.Scanner

Scanner sc = new Scanner(System.in); // 콘솔입력

 

2. BufferedReader

편리한 Scanner를 두고 BufferedReader를 사용하는 이유는 바로 속도차이 때문이다.

Scanner보다 빠른 속도를 갖기 때문에 알고리즘 문제 풀이에서 많은 입력 데이터를 받으려면 BufferedReader를 사용하는 것이 효율적이다.

 

단, 속도가 빠른 대신 입력을 모두 String Type으로 받기에 만약 int형 입력을 받고싶다면 형변환을 명시적으로 해주어야 한다.

또한, 이를 사용하기 위해선 throws IOException 예외 처리가 필수적이다. Scanner와 마찬가지로 import가 필요하다.

import java.io.BufferedReader
import jva.io.InputStreamReader

BufferedReader br = new BufferedReader(new InputStream(System.in));

// 입력받는 방법
String str = br.readLine();
int num = Integer.parseInt(br.reaedLine());

 

BufferedReader는 개행이 되기 전 까지 모든 입력을 한 번에 받기 때문에 공백을 기준으로 입력을 받아야 한다면 변형해서 사용해야 한다. 공백을 기준으로 받아야 하는 입력에 대해서는 StringTokenize 클래스를 이용해야 한다.

import java.util.* // Stringtokenizer를 사용하기 위해선 util 패키지를 import 해야 한다.

StringTokenizer st = new StringTokenizer(br.readLine());

int x = Integer.partseInt(st.nextToken());
int y = Integer.partseInt(st.nextToken());
int z = Integer.partseInt(st.nextToken());

그렇다면 Scanner와 BufferedReader의 속도가 차이나는 이유는 뭘까?

버퍼 사용 유무때문이다.

 

BufferedReader는 버퍼를 이용해 입력을 받는다.

키보드에서 입력을 할 때 마다 버퍼에 쌓아두고 개행문자를 만나면 버퍼에 쌓인 문자를 한 번에 전송한다.

 

반면, Scanner는 버퍼를 사용하지 않고 입력을 바로 바로 전송한다. 그렇기에 속도가 느리다.

 

따라서 단순하게 사용하기에는 Scanner가 용이하지만 입력을 받을 데이터 수가 굉장히 많다면 BufferedReader를 사용하는 것이 효율적이다.


Reference

velog작성일 : 2022년 10월 15일