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) {
if( 0 <= jumsu && jumsu <= 100 )
return true;
else {
System.out.println(">> 점수는 입력은 0 이상 100 까지만 가능합니다 <<");
return false;
}
}
boolean cheakAge(short age) {
if( 20 <= 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)
*/
'Java' 카테고리의 다른 글
[Java] Wrapper, Math 클래스와 if, switch문 (0) | 2021.01.12 |
---|---|
19 [인강] 자바의정석 ch09 (0) | 2021.01.12 |
[Java] Java의 설치와 기본 개념 (0) | 2021.01.09 |
[Java] 생성자, 형변환(casting), 연산자(operator) (0) | 2021.01.07 |
[Java] 데이터와 변수 (0) | 2021.01.07 |
- git연동
- 웹페이지만들기
- 독서후기
- jdbc
- 정보처리기사 실기
- spring
- 정보처리기사
- LifecycleException
- 개발도서
- 오늘의코딩
- intellij
- 실용주의프로그래머
- IT 5분 잡학사전
- 정보처리기사 필기
- gradle build
- ubuntu
- JIRA
- 북클럽
- 기술블로그
- filezila
- putty
- 호스팅영역
- 노개북
- java
- gradle
- SQLD
- 노마드코더
- AWS
- EC2
- 배포
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |