java.util.Scanner
기본형과 문자열을 분석할 수 있는 단순한 텍스트 스캐너 클래스
다른 타입(기본형, 문자열)을 읽기 위해서 정규표현식을 내부적으로 사용
키보드에서 입력된 키를 문자나 정수, 실수, 문자열 등 원하는 타입으로 변환
입력하는 키 값을 공백 문자(' ', '\t', '\n')를 기준으로 분리하여 토큰 단위로 읽음
System.in
키보드 장치를 직접 제어하고 키 입력을 받는 표준 입력 스트림 객체
입력된 키를 단순한 바이트 정보로 응용프로그램에게 제공
응용프로그램은 받은 바이트 정보를 문자나 숫자로 변환해야 함
import
Scanner 클래스는 자바에서 제공되는 java.util 패키지에 있음
Scanner를 사용하기 위해 프로그램의 맨 앞줄에 import문 필요
import java.util.Scanner;
import java.util.*;
객체 생성
생성자에 System.in 매개값 지정
Scanner 스캐너이름 = new Scanner(System.in);
Scanner scan = new Scanner(System.in);
메소드
데이터를 입력한 후 Enter키를 누르면 동작
메소드 | 설명 |
String next() | 다음 토큰을 문자열로 리턴 |
byte nextByte() | 다음 토큰을 byte 타입으로 리턴 |
short nextShort() | 다음 토큰을 short 타입으로 리턴 |
int nextInt() | 다음 토큰을 int 타입으로 리턴 |
long nextLong() | 다음 토큰을 long 타입으로 리턴 |
float nextFloat() | 다음 토큰을 float 타입으로 리턴 |
double nextDouble() | 다음 토큰을 double 타입으로 리턴 |
boolean nextBoolean() | 다음 토큰을 boolean 타입으로 리턴 |
String nextLine() | '\n'을 포함하는 한 라인을 읽고 '\n'을 버린 나머지 문자열 리턴 |
void close() | Scanner의 사용 종료 |
boolean hasNext() | 현재 입력된 토큰이 있으면 true, 아니면 입력 때까지 무한정 대기, 새로운 입력이 들어올 때 true 리턴 crtl-z 키가 입력되면 입력 끝이므로 false 리턴 |
키 입력받기
데이터타입 변수이름 = 스캐너이름.메소드
int age = scan.nextInt();
double weight = scan.nextDouble();
String name = scan.next();
boolean isSingle = scan.nextBoolean();
nextLine() | next()
next()로는 공백이 낀 문자열을 읽지 못하기 때문에 공백이 낀 문자열을 입력받기 위해서는 nextLine() 사용
nextLine()은 Enter키의 입력을 기다리는 용도로 사용 가능
Enter키만 입력될 때, nextLine()은 빈 문자열("")을 리턴하면서 바로 돌아오지만,
next()는 빈 문자열("")을 리턴하지 않기 때문에 Enter키를 계속 입력하여도 다른 키가 입력될 때까지 기다림
-> nextLine()은 Enter값이 입력되기 전까지 입력받은 문자열을, next()는 공백(스페이스) 전까지 입력받은 문자열 리턴
* next() 다음에 nextLine()을 실행하는 경우 발생하는 nextLine()이 그냥 넘어가버리는 오류
next()가 실행되어 콘솔에 값을 입력하고 Enter키를 누를 때 값을 리턴시켰지만 Enter값이 그대로 남아 있음
nextLine()은 Enter값을 기준으로 메소드를 종료시키기 때문에 nextLine()이 실행될 때 남아있는 Enter값을 그대로 읽어서 실행과 동시에 바로 종료
next() 이후 문자 입력을 원한다면 next()를 사용하거나, nextLine()을 한 번 더 사용하여 남아있는 Enter값을 없애야 함
객체 사용 종료
Scanner 객체가 닫히면 System.in도 함께 닫히므로 더이상 System.in을 사용하여 키 입력을 받지 못함
Scanner를 닫는 코드가 없으면 컴파일 시에 경고(warning)가 발생하지만, 실행에는 문제 없음
프로그램이 종료되면 자동으로 닫힘
스캐너명.close();
scan.close();
java.io.BufferedReader
문자 입력 스트림에서 텍스트를 읽는 클래스
문자의 순서(시퀀스)를 효율적으로 읽기 위하며 문자 버퍼링
입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성을 높임
많은 양의 데이터 처리 시 유용
Buffer
데이터를 한 곳에서 다른 곳으로 전송하기 전 일시적으로 그 데이터를 보관하는 임시 메모리 영역
입출력 속도 향상을 위해 버퍼 사용(속도 차이가 날 때, 묶어서 보내는 것이 더 효율적)
Stream
연속적인 데이터의 흐름
데이터를 전송하는 소프트웨어 모듈
import
BufferedReader 클래스는 자바에서 제공되는 java.io 패키지에 있음
BufferedReader를 사용하기 위해 프로그램의 맨 앞줄에 import문 필요
import java.io.BufferedReader;
import java.io.InputStreamReader;
객체 생성
System.in: 바이트스트림
InputStreamReader: 문자스트림
바이트 단위 데이터를 문자 단위 데이터로 처리할 수 있도록 변환
-> 키보드로부터 문자를 입력받기 위해 표준 입력 스트림인 System.in과 InputStreamReader 스트림 객체 연결
BufferedReader
Buffer(버퍼)를 통해 입력받은 문자를 쌓아둔 뒤 문자열처럼 사용
-> InputStreamReader의 객체를 입력받아 Enter값 입력 전까지의 모든 텍스트를 BufferedReader에 저장
InputStreamReader 문자입력스트림이름 = new InputStreamReader(System.in);
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader 버퍼이름 = new BufferedReader(문자입력스트림이름);
BufferedReader br = new BufferedReader(in);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
메소드
입력 메소드로 주로 readLine() 사용
한 줄 전체(공백 포함)를 읽기 때문에 char 배열을 하나하나 생성할 필요 없이 String으로 바로 리턴
키 입력받기
데이터타입 변수이름 = 버퍼이름.메소드
String name = br.readLine();
// 데이터타입 변환
데이터타입 변수이름 = 기본형타입.parseXXX(버퍼이름.메소드);
int age = Integer.parseInt(br.readLine());
float weight = Float.parseFloat(br.readLine());
* parseXXX() 메소드
문자열을 분석하여 해당 타입으로 변경
문자열이 반드시 해당 타입의 데이터로만 구성되어 있어야 함
다른 타입의 데이터가 섞여있는 경우 데이터타입 변환 불가, 에러 발생
예외 처리
// try ~ catch
try {
...
} catch(IOException e)
// throw Exception
import java.io.IOException;
public class 클래스이름 {
public static void main(String[] 변수이름) throws IOException {
...
}
Scanner | BufferedReader 차이점
Scanner | BufferedReader |
java.util.Scanner 클래스 | java.io.BufferedReader 클래스 |
자바 프로그램에서 입력을 읽는 가장 쉬운 방법으로 기본 유형과 문자열을 구문 분석 할 수 있는 간단한 텍스트 스캐너 |
문자 시퀀스를 효율적으로 읽을 수 있도록 하는 문자 입력 스트림 |
1KB char 버퍼 | 8KB char 버퍼 |
버퍼를 사용하지 않고 키를 누르는 즉시 입력을 전송하여 속도 느림 |
키를 버퍼에 전송 후, 버퍼의 내용을 한 번에 전송하여 속도 빠름 |
공백, Enter값을 경계로 입력값 인식 | Enter값만 경계로 인식하여 일반적으로 라인 단위로 입력 |
입력과 동시에 타입이 확정되어 가공의 필요가 없어 사용하기 편리 |
입력받은 값은 String 타입으로 반환되어 다른 타입으로 입력을 받을 시 타입 변환 필요 |
입력 메소드의 타입에 맞게 정규식 검사 후 검사된 문자열 반환 |
throw Exception 또는 try ~ catch를 이용하여 따로 예외 처리 필요 |
'JAVA > memo' 카테고리의 다른 글
반복문 (0) | 2021.03.08 |
---|---|
조건문 (0) | 2021.03.05 |
연산자 (0) | 2021.03.05 |
데이터 타입 & 변수 (0) | 2021.03.05 |
자바 프로그램 구조 (0) | 2021.03.05 |