JAVA/memo

키 입력

마이구미2 2021. 3. 5. 15:08

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