HCN DEV

Java Scanner의 에러 체크하기(Validation)

Java Scanner의 에러 체크하기(Validation) feature image

 자바에서는 사용자로부터 콘솔창에서 입력을 받을 때, 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); // 에러 체크 메소드

  }
}

 적절히 위의 방식을 섞어서 쓰면 이런 저런 곳에서 활용할 수 있을 것 같네요.

더 볼만한 추가 자료