OneDev
[JAVA] 입력받기 (Scanner vs BufferedReader) 본문
※ 목차
- 0. 요약
- 1. Scanner 클래스
- 2. BufferedReader 클래스
- 3. Scanner 사용법
- 4. BufferedReader 사용법
◎ 0. 요약
클래스 | Scanner | BufferedReader |
설명 | 입력받은 데이터를 다양한 타입으로 변환하의 반환하는 클래스. 기본형과 String 타입을 정규표현식을 사용해 파싱한다 |
데이터를 한 번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스, |
동작 방식 | 공백과 개행문자 ( '\n', '\t', '\r' , ...) 를 기준으로 입력을 받으며, 데이터를 입력받을 경우 즉시 사용자에게 전송된다. 입력받을 때마다 전송되기고, 내부적으로 정규표현식을 사용하기 때문에 BufferedReader에 비해 더 많은 시간 소요 |
일정한 크기의 데이터를 한 번에 읽어와 버퍼에 보관한 후, 사용자의 요청이 있을 때 버퍼에서 데이터를 읽어오는 방식으로 동작. |
동기화(Syncronize) | X | O |
패키지 | java.util.Scanner | java.io.BufferedReader |
읽기 가능한 타입 | 원하는 타입 | 문자열 (String) Only |
버퍼사이즈 | 1KB (1024 byte) | 8 KB (8192 byte) |
예외처리 | 별도의 예외처리 필요 없음 | 예외처리 필수 (throw IO Exception 또는 try & catch) |
속도 | 느림 | 빠름 |
멀티쓰레드 안정성 | unsafe | safe |
◎ 1. Scanner 클래스
▶ 패키지 : java.util ( java.util.Scanner)
▶ 공백 & 개행 문자를 기준으로 입력받는다
▶ 타입에 구애받지 않고 입력 받을 수 있다
▶ 별도의 예외처리를 명시할 필요 없다 (UnChecked(Runtime) Exception)
▶ Thread unsafe 하기에 멀티스레드 환경에서 문제가 발생할 수 있다
▶ 데이터를 입력받을 경우 즉시 사용자에게 전송된다.
◎ 2. BufferedReader 클래스
▶ 패키지 : java.io (java.io.BufferedReader)
▶ 데이터를 파싱하지 않고 String 으로만 읽는다
▶ Checked Exeption → 반드시 예외처리를 해야 한다 (throw I/O Exception 또는 try/catch)
▶ Thread Safe 하기에 멀티스레드 환경에서도 안전하다
▶ 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 전달한다.
▶ 많은 양의 데이터를 처리할 때 유리하다
◎ 3. Scanner 사용법
(1) 패키지 import 하기 ( import java.util.Scanner)
import java.util.Scanner
(2) Scanner 객체 생성
Scanner scan = new Scanner(System.in);
( ※ System.in 이란 ? → 사용자로부터 입력을 받기 위한 입력 스트림 / 다른 입력클래스들도 System.in 을 통해 사용자 입력을 받는다)
(3) 메소드를 이용해 입력받기
주로 사용하는 메소드들은 아래와 같이 있으며, 더 자세한 정보는 공식 API 를 참조하면 볼 수 있다
(공식 API Scanner 링크 -> https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html)
Scanner (Java Platform SE 8 )
Scans the next token of the input as a float. This method will throw InputMismatchException if the next token cannot be translated into a valid float value as described below. If the translation is successful, the scanner advances past the input that match
docs.oracle.com
메소드 | 설명 |
nextInt() | 정수 입력 (input 의 다음 토큰을 int 형으로 받는다) |
nextDouble() | Double 형 입력 |
next() | 다음 토큰을 입력받는다 |
nextLine() | 한 줄을 입력받는다 |
<< 사용 예시 >>
import java.util.Scanner
public Class Main{
public static void Main(String[] args){
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
String str = scan.next();
...
...
scan.close();
}
}
◎ 4. BufferedReader 사용법
(1) 다음의 패키지 import
- java.io.BufferedReader
- java.io.IOException
- java.io.InputStreamRedaer
( import java.io.* 로 한 번에 처리 가능)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 또는 import java.io.*
(2) 예외처리 → throw exception 또는 try/catch
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException { //예외처리
}
}
(3) 객체 생성
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BR {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 객체생성
}
}
(4) 메소드를 이용해 입력받기 (readLine())
- readLine() 메소드를 주로 이용
- readLine() 의 리턴값은 String 이기 때문에, 다른 타입으로 입력을 받기 위해서는 형변환이 필요하다
- 데이터는 Line 단위로만 입력되기 때문에, 데이터를 가공하기 위해 StringTokenizer 또는 String.split() 함수 를 같이 활용하는 경우가 많다
※ StringTokenizer → 문자열을 지정한 구분자로 쪼개주는 클래스이며, 쪼개어진 문자열을 토큰 (token) 이라 부른다. 사용하기 위해서는 java.util.StringTokenizer 라이브러리를 import 해야 한다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
// StringTokenizer
StringTokenizer st = new StringTokenizer(s);
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
// String.split()
String array[] = s.split(" "); // " " 을 구분자로 쪼개어 배열에 보관
br.close();
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA] Object 클래스 (0) | 2024.05.06 |
---|---|
[JAVA] java.lang 패키지 (0) | 2024.04.29 |
[JAVA] 배열 출력하기 (반복문 / Arrays.toString()) (0) | 2023.06.03 |
[JAVA] 2.연산자(Java Operator) (0) | 2023.01.23 |
[JAVA] 1.변수(Variable) : 선언, 초기화, 자료형, 형변환 (0) | 2023.01.02 |