Java

[Java] Scanner문, 유효성 검사

Rosie_dev 2021. 1. 11. 19:00

Scanner 문


// System.in       키보드 값을 입력받을 때

// System.out    모니터로 값을 출력할 때

 

Scanner문을 사용할 때, import java.util.Scanner; 이 필요하다. 이클립스에서 scanner 생성시 자동 추가된다. 

 

Scanner 변수명.nextLine();

입력받은 값(문자열)을 저장할 때 사용된다.

.nextLine은 입력받은 값이 문자열 즉, 공백까지 포함하며 종결자는 enter키이다. 하지만 .nextInt();  .nextDouble(); 과 같이 정수, 실수 등의 형태로 입력받을 때 종결자는 공백, enter키 둘 다 가능하다. 따라서 불필요하게 받은 데이터 버퍼가 발생하는데 이를 지우는 경우에도 사용된다.

 

sc.close();

데이터 leak를 방지하기 위해 close를 해야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Scanner;
 
public class Scanner1Main {
 
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        System.out.print("문장을 입력하세요 => ");    
        String inputStr = sc.nextLine();
                   
        System.out.println("입력한 문장 => "+inputStr);
        
        System.out.println("정수를 입력하세요 => ");
        int inputNum = sc.nextInt();   
      
        sc.nextLine();
        
        sc.close(); //sc 닫아줌
 
    }
 
}
cs

 

try - catch 문


plus, devide 메서드를 만들고 입력받은 정수의 계산에 활용하기

 

나누기에 경우는 분모가 0인 경우, Infinity 값이 출력된다. 이를 방지하기 위해서는 메서드 내에 if-else문을 작성해서 분모가 0이 되는 일이 없도록 해야 한다.

//코드를 작성하면서 일어날 수 있는 경우의 수를 고려해야 한다.

 

 

try - catch문으로 error 가 발생했을 때의 오류처리를 작성해준다.

try { }

catch (Exception e) { }

*NumberFormatException: 정해진 int, short 등의 형의 범위를 벗어난 값이 입력되는 경우, 발생하는 오류

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package my.day04.a.scanner;
 
public class Calculator {
 
        String plus(int num1, int num2) {    // plus(10, 20)
            
            return num1+ "+" +num2+ "=" +(num1+num2);
            // 10+20=30
        }
        
        String devide(float num1, int num2) { 
            if(num2 == 0) {
                return "분모에는 0이 들어올 수 없습니다!!";
            } else {
                return num1+ "/" +num2+ "=" +(num1/num2);    
            }
        }
        
    }
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package my.day04.a.scanner;
 
import java.util.Scanner;
 
public class Scanner5Main {
 
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        System.out.println("== 2개의 숫자를 입력받아서 계산한 결과 알아보기 ==");
        
        String inputStr = "";
        
        try {
            
            System.out.println(">> 첫번째 정수 입력: ");
            inputStr = sc.nextLine();        
            int num1 = Integer.parseInt(inputStr);   
                    
            System.out.println(">> 두번째 정수 입력: ");
            inputStr = sc.nextLine();        
            int num2 = Integer.parseInt(inputStr);   
            //문자열을 int타입으로 형변환 시켜주는 것
            
            Calculator calc = new Calculator();
            
            String result = calc.plus(num1, num2);
            System.out.println(result);
                    
            result = calc.devide(num1, num2);
            System.out.println(result); //10/20=0.5
            
            
        } catch(NumberFormatException e) {
            System.out.println(">> "+inputStr+"는 정수가 아닙니다. 정수만 입력하세요!!");
        }
                
        sc.close();        
    }
 
}
cs

 

문자열 ↔ 정수


Integer.toString( );

String.valueOf( );

//정수를 문자열로 바꾸는 방법

 

Interger.parseInt( );

//문자열을 정수로 바꾸는 방법

 

1
2
3
4
5
6
7
//정수를 문자열로 바꾸는 첫번째 방법
String str1 = Integer.toString(num1);  //"10"
        
//정수를 문자열로 바꾸는 두번째 방법
String str2 = String.valueOf(num2);    //"20"
 
System.out.println(str1+str2);         //"1020"
cs

 

//메서드(cheakJumsu( ))를 이용해 겹치는 코드줄이기

 

1
2
3
4
5
6
7
8
9
System.out.print("3. 국어: ");
Byte.parseByte(sc.nextLine());
            
//    if(sj.kor < 0 || sj.kor > 100 )
if(!(0 < sj.kor && sj.kor <= 100)) {
     System.out.println(">> 점수는 입력은 0 이상 100 까지만 가능합니다 <<");
     sc.close();
     return;
}
cs

 

 

1
2
3
4
5
6
7
8
9
System.out.print("3. 국어: ");
byte kor = Byte.parseByte(sc.nextLine());
 
if (!sj.cheakJumsu(kor)) {  
                sc.close();
                return;
else {
    sj.kor = kor;
}
cs

 

유효성 검사


에러 타입이 다를 때, 출력하는 문장도 다르게 하고 싶은 경우에는 구분을 위해 inputType이라는 임의의 지역변수를 설정해서 사용한다.

int inputType = 0; 값을 초기화하고 오류에 해당하는 입력받고자 하는 try문 내 코드 앞에 inputType = 1; 또는 inputType = 2; 와 같이 구분한다. 그리고 catch 문에 if - else if문으로 나누어 오류에 대한 조치 값을 설정해둔다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
package my.day04.b.scanner;
 
import java.util.Scanner;
 
public class SungjulkMain4 {
 
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        Sungjuk sj = new Sungjuk();
        
        int inputType = 0;
        
        try {
            
            System.out.print("1. 학번: ");
            sj.hakbun = sc.nextLine();
            
            System.out.print("2. 성명: ");
            sj.name = sc.nextLine();
            
            //0~100
            //byte: -128 ~ 127
            
// === *** 유효성 검사하기 (올바른 데이터인지 틀린 데이터인지 검사하는 것) *** ===
            //Integer.parseInt(String str)
            //Short.parseShort(String str)
            
            inputType = 1//inputTye 값이 1이라면, 국영수를 입력하는 중이다 라고 본다.
            
            System.out.print("3. 국어: ");
            byte kor = Byte.parseByte(sc.nextLine());
                                     // "똘똘이" "2000" "-50" "90"
            
            if (!sj.cheakJumsu(kor)) {  
                sc.close();
                return;
            } else {
                sj.kor = kor;
            }
            
            System.out.print("4. 영어: ");
            byte eng = Byte.parseByte(sc.nextLine());
            if (!sj.cheakJumsu(eng)) {  
                sc.close();
                return;
            } else {
                sj.eng = eng;
            }
            
            
            System.out.print("5. 수학: ");
            byte math = Byte.parseByte(sc.nextLine());
            if (!sj.cheakJumsu(math)) { 
                sc.close();
                return;
            } else {
                sj.math = math;
            }
            
            inputType = 2//inputTye 값이 2이라면, 나이를 입력하는 중이다 라고 본다.
            
            System.out.print("6. 나이: ");
            short age = Short.parseShort(sc.nextLine());
            if (!sj.cheakAge(age)) {         //if(false) {} ==> dead code
                sc.close();
                return;
            } else {
                sj.age = age;
            }
            
           sj.showInfo();
            
            /*
             * === 이순신 님의 성적결과 ===
             * 1. 학번: 091234
             * 2. 성명: 이순신
             * 3. 국어: 90
             * 4. 영어: 80
             * 5. 수학: 78
             * 6. 총점: 248
             * 7. 평균: 82.666666667
             * 8. 학점: B
             * 9. 나이 : 20
             */
            
            
        } catch (NumberFormatException e) {
            if(inputType == 1
                System.out.println("## 점수는 입력은 0 이상 100 까지만 가능합니다 ##");
            else if (inputType == 2
                System.out.println("## 나이 입력은 20 이상 50 까지만 가능합니다 ##");
            
            e.printStackTrace();
        }
        
         sc.close();
    }
 
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package my.day04.b.scanner;
 
public class Sungjuk {
 
    String hakbun;
    String name;
    byte kor;     // -128 ~ 128      0 ~ 100
    byte eng;
    byte math;
    short age;    //-32768 ~ 32768      20 ~ 50
        
    // 기본생성자 생략 public Sungjuk() {}
    
    boolean cheakJumsu(byte jumsu) {
        if0 <= jumsu && jumsu <= 100 ) 
            return true;
        else {
            System.out.println(">> 점수는 입력은 0 이상 100 까지만 가능합니다 <<");
            return false;
        }
    }
            
    boolean cheakAge(short age) {
        if20 <= age && age <= 50 ) 
            return true;
        else {
            System.out.println("== 나이는 입력은 20 이상 50 까지만 가능합니다 ==");
            return false;
        }
            
    }
    
    
    void showInfo() {
        
        int total = (kor+eng+math);
        float avg = total/3.0F;
 
        String grade= "";
        if(avg >= 90)       grade = "A";
        else if (avg >= 80) grade = "B";
        else if (avg >= 70) grade = "C";
        else if (avg >= 60) grade = "D";
        else                 grade = "F";
        
        System.out.println("\n=== "+name+"의 성적결과 ===\n"
                + "1. 학번 : "+hakbun+"\n"
                + "2. 성명 : "+name+"\n"
                
                + "3. 국어 : "+kor+"\n"
                + "4. 영어 : "+eng+"\n"
                + "5. 수학 : "+math+"\n"
                + "6. 총점 : "+total+"\n"
                + "7. 평균 : "+avg+"\n"
                + "8. 학점 : "+grade+"\n"
                + "9. 나이 : "+age+"\n");
            
    }
    
}
cs

 

e.printStackTrace();

 

오류 발생경로를 이클립스에서 확인할 수 있다.

/*

java.lang.NumberFormatException: Value out of range. Value:"88888888" Radix:10

            at java.lang.Short.parseShort(Unknown Source)

            at java.lang.Short.parseShort(Unknown Source)

            at my.day04.b.scanner.SungjulkMain4.main(SungjulkMain4.java:59)

*/

  

댓글