블로그 이미지

[Java] 키보드 입력받는 방법

2017.02.14 16:50

Java에서 키보드 문자 입력 방법에 대해서 정리해봅니다.


C언어로 이야기 하자면 scanf() 에 해당할 수 있습니다.




총 3가지 있으며 결론 부터 이야기 한다면,


1) Scanner를 사용하거나

2) System.in.read() 함수와 BufferedReader를 혼용해서 사용 하는 방법이 있을 수 있겠습니다.

Scanner 와 BufferedReader를 차이점을 비교하자면, 사용의 편의성을 말할 수 있습니다.
그리고 Scanner가 더 최근에 나온 객체입니다.


방법1. Scanner 객체 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Scanner scn = new Scanner(System.in);
 
byte byt = scn.nextByte();
 
short srt = scn.nextShort();
 
long lng = scn.nextLong();
 
float flt = scn.nextFloat();
 
double dbl = scn.nextDouble();
 
boolean ble = scn.nextBoolean();
 
String strLine = scn.nextLine();
String str = scn.next();
cs


위와 같은 방법으로 Scanner 객체를 생성하고 System.in 을 연결 시켜주면 표준입력스트림을 받아 볼 수 있다.


Enter 입력 예외처리

그런데, 여기서 주의 깊게 봐야할 점이 있다.  

바로, 문자열을 입력 받을 때 사용하는 함수가 두개가 있는 점이다. 


1
2
String str = scn.next();
String strLine = scn.nextLine();
cs


두 개의 차이점은 무엇인가?


next()는 공백 단위로 문자열을 읽는다.


nextLine()는 Enter 단위로 문자열을 읽는다.  (Enter 입력은 \r\n 으로 구성된 두개의 문자이다.)



그래서 next()와 nextLine()을 섞어서 사용할 때 주의 할 점이 있다.


1
2
3
4
5
6
7
8
9
10
Scanner scn = new Scanner(System.in);
System.out.println("배열 크기를 입력하세요");
        
int ArraySize = scn.nextInt();
 
String[] strArray = new String[ArraySize];
 
System.out.println("문자열을 스페이스바로 띄워서 입력해주세요.");
 
String strInput = scn.nextLine();
cs


위와 같은 예제에서

next() 실행 라인에서 숫자 2와 Enter를 입력 시, nextLine()에서 입력을 기다리지 않고 바로 통과 되어 버린다.

그 이유는, nextInt()가 실행될때 숫자 2만 읽고, Enter(\r\n)값은 입력 스트림 버퍼에 남아 있기 때문이다. 

따라서, nextLine() 실행 시, 남아 있는 Enter 값을 읽어 들이고 통과하게 된다. 


따라서, 원하는 대로 동작하려면 아래와 같이 수정 해야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
Scanner scn = new Scanner(System.in);
System.out.println("배열 크기를 입력하세요");
        
int ArraySize = scn.nextInt();
 
/*!!!!!!!!!!!!! Enter 입력처리 !!!!!!!!!!!!!!*/
scn.nextLine();
 
 
String[] strArray = new String[ArraySize];
 
System.out.println("문자열을 스페이스바로 띄워서 입력해주세요.");
 
String strInput = scn.nextLine();
cs



방법2. System.in.read() 함수 사용


두 번째 방법으로 System 클래스에서 제공하는 read() 라는 함수를 이용하여 키보드 입력을 받아보자.

read() 함수는 1byte 크기만 입력스트림에서 읽어와 ASCII 코드에 해당하는 int 값을 리턴한다.


그래서 문자를 입력받을때 주로 사용한다.


1
2
3
4
5
//문자 a 저장
char chr = (Char)System.in.read();
 
//문자 a 대신 97숫자 저장
int ascii = System.in.read();
cs



Enter 입력 예외처리

그러면 Enter에 대한 예외 처리는 어떻게 할 것인가?
read()함수의 경우 Scanner의 next()함수와 유사하게 동작한다. 숫자 + Enter 입력 시, Enter(\r\n) 값은 입력스트림 버퍼에 그대로 남아 있게 된다.

따라서, 아래와 같이 예외 처리를 해주어야 한다.
Enter의 경우 두개의 문자 (\r\n) 이므로 read()함수를 두 번 호출하여 문자들을 버퍼에서 제거 해준다.


1
2
3
4
5
char chr = (Char)System.in.read();
 
/*!!!!!!!!!!!!! Enter 입력처리 !!!!!!!!!!!!!!*/
System.in.read();
System.in.read();
cs

또는

1
2
3
4
char chr = (Char)System.in.read();
 
/*!!!!!!!!!!!!! Enter 입력처리 !!!!!!!!!!!!!!*/
System.in.skip(2);
cs


방법3. BufferedReader 객체 사용


BufferedReader 객체는 문자를 스트림에서 읽을 때 버퍼를 사용하여 좀더 문자열 처리를 편리하게 해주는 객체 이다.

InputStreamReader의 경우 한 문자씩 스트림에서 읽어 오지만, BufferedReader는 미리 스트림에 있는 데이터를 버퍼에 받아 온다.

1
2
3
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 
String srt = in.readLine();
cs

 
위와 같이 readLine() 함수를 사용하면 \r\n을 인식하며 한 줄을 읽어온다. Scanner의 nextLine() 함수와 유사하게 동작한다.

문자 하나만 읽고 싶을 때는 방법2의 System.in.read()함수를 사용한다.