Java Scanner의 에러 체크하기(Validation)
04 Oct 2016
자바에서는 사용자로부터 콘솔창에서 입력을 받을 때, Scanner라는 클래스를 사용합니다. 이 포스팅에서는 Scanner를 사용할 때 잘못된 입력(예를 들어, 정수형 3을 받아야 하는데 "aaa"같은 String이 들어오는 경우)이 들어오는 것을 방지하는 것에 대해 알아봅니다.
1. 단일입력 처리
먼저 Scanner로 단 1개의 0또는 자연수
만 받는 예제입니다. 실수도 안 되고, 음의 정수도 안 되고, 문자열도 안 받습니다. 띄어쓰기로 여러 개를 넣어도 받지 않습니다.
class ScannerErrCheck { //scanner로 입력 받는 데이터타입 예외처리용 class입니다.
int scNum ;
void errorCheckNum ( Scanner scNum ){ // 0또는 자연수 체크하는 메소드
while ( true ){
if ( scNum . hasNextInt ()){ // 정수를 받는지 체크
this . scNum = scNum . nextInt ();
String [] lengthOfInput = scNum . nextLine (). split ( " " );
this . coef = new float [ lengthOfInput . length ];
if ( lengthOfInput . length != 1 ){ // 1개만 받는지 체크
System . err . println ( "1개의 숫자만 입력하세요." );
scNum . reset ();
continue ;
}
if ( this . scNum >= 0 ) // 0 이상 자연수라면 차수 결정
break ;
else { // 음의 정수이면, 재입력 요구
System . err . println ( "0 또는 자연수를 입력하세요." );
scNum . reset ();
continue ;
}
} else { // 실수이면, 재입력 요구
System . err . println ( "정수를 입력하세요." );
scNum . next ();
}
}
}
}
public class Main {
public static void main ( String [] args ){
ScannerErrCheck err1 = new ScannerErrCheck (); // scanner가 1개의 자연수만 받도록 하는 class
Scanner scNum = new Scanner ( System . in );
System . out . println ( "1개의 자연수를 입력하세요 >>" );
err1 . errorCheckNum ( scNum );
}
}
2. 복수개 입력 실수인지 체크
다음으로는 Scanner로 띄어쓰기를 통해 여러개의 data를 받을 때 실수형인지 체크하는 예외 처리입니다.
class ScannerErrCheck { //scanner로 입력 받는 데이터타입 예외처리용 class입니다.
float [] scArr = new float [ 5 ];
void errorCheckArr ( Scanner scArr ){
int counter = 0 ;
while ( true ){ // 입력 받은 수를 scArr[i]에 저장하는 작업 진행
for ( int i = 0 ; i < this . scArr . length ; i ++){
if ( scArr . hasNextFloat ()) { // 받은 수가 실수(혹은 정수)일 경우 입력,
this . scArr [ i ] = scArr . nextFloat ();
counter ++;
}
else { // 실수가 아니라면 입력을 리셋하고, 새로운 입력 요구
System . err . println ( "모든 계수는 실수형이어야 합니다." );
scArr . reset ();
scArr . next ();
}
}
if ( counter == this . coef . length ) // counter 갯수가 배열의 길이와 같아지면 루프 종료
break ;
else { // 1개의 입력이라도 실수형이 아니라면, 전부 새로운 입력 요구
counter = 0 ;
scArr . reset ();
}
}
}
}
public class Main {
public static void main ( String [] args ){
ScannerErrCheck err1 = new ScannerErrCheck ();
Scanner scArr = new Scanner ( System . in );
System . out . println ( "여러개의 실수를 입력하세요. >>" );
err1 . errorCheckArr ( scArr ); // 에러 체크 메소드
}
}
적절히 위의 방식을 섞어서 쓰면 이런 저런 곳에서 활용할 수 있을 것 같네요.
더 볼만한 추가 자료