TIL-Calculator 개인 과제 정리
TIL-Calculator 개인 과제 정리
2024-05-01
오늘의 학습 🌠
개인 과제 정리 📃
Level 1-1
- Scanner를 사용하여 양의 정수 2개(0포함)를 전달 받을 수 있음.
양의 정수는 각각 하나씩 전달 받음
양의 정수는 적합한 타입으로 선언한 변수에 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.Scanner;
public class App {
/**
* Scanner를 사용하여 양의 정수 2개를 전달 받기
* @param args
*/
public static void main(String[] args) {
/*Sacnner 클래스 객체 생성 */
//왜 사용? : 매번 입력마다 new Scanner(System.in)아라는 긴 내용을 쓰는건 귀찮음 + 코드 중복으로
//Scanner 클래스의 객체를 하나 생성해두어 이를 사용하는 것
Scanner sc = new Scanner(System.in);
//입력 메세지 출력
System.out.println("첫 번째 숫자를 입력하세요 : ");
//Scanner 클래스의 객체인 sc를 사용하여 양의 정수를 firstNum 변수에 입력 받음
int firstNum = sc.nextInt();
//입력 메세지 출력
System.out.println("두 번째 숫자를 입력하세요 : ");
//Scanner 클래스의 객체인 sc를 사용하여 양의 정수를 secondNum 변수에 입력 받음
int secondNum = sc.nextInt();
}
}
- 양의 정수 2개를 입력 받는 과정 수행 (해결 O)
Level 1-2
- Scanner를 사용하여 사칙연산 기호를 전달 받을 수 있음.
- 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장(charAt(0))
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
import java.util.Scanner;
public class App {
public static void main(String[] args) {
/*Sacnner 클래스 객체 생성 */
//왜 사용? : 매번 입력마다 new Scanner(System.in)아라는 긴 내용을 쓰는건 귀찮음 + 코드 중복으로
//Scanner 클래스의 객체를 하나 생성해두어 이를 사용하는 것
Scanner sc = new Scanner(System.in);
System.out.println("첫 번째 숫자를 입력하세요 : ");
//Scanner 클래스의 객체인 sc를 사용하여 양의 정수를 firstNum 변수에 입력 받음
int firstNum = sc.nextInt();
System.out.println("두 번째 숫자를 입력하세요 : ");
//Scanner 클래스의 객체인 sc를 사용하여 양의 정수를 secondNum 변수에 입력 받음
int secondNum = sc.nextInt();
System.out.println("사칙연산 기호를 입력하세요 : " );
// Scanner 클래스의 객체인 sc에 next()를 사용하여 입력 다음에 오는 토큰을 읽음
// 읽어들인 문자열에서 첫 번째 문자를 추출하고 char 타입의 operator 변수에 저장
char operator = sc.next().charAt(0);
}
}
char operator = sc.next().charAt(0);
은 Scanner 클래스 객체인 sc에 next( )를 사용하여 입력 다음의 토큰을 읽음, 읽어들인 문자열에서 첫 번 째 문자를 출출하고 변수에 저장따라서 첫 번째 입력받는 문자가 변수에 저장! (해결 O)
Level 1-3
- 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값 출력
사칙연산 기호에 맞는 연산자를 사용하여 연산을 진행
- 입력받은 연산 기호를 구분하기 위해 제어문 사용
- 연산 오류가 발생할 경우 해당 오류에 대한 내용을 정제하여 출력
📌main
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
import java.util.Scanner;
public class App {
public static void main(String[] args) throws BadInputException {
Scanner sc = new Scanner(System.in);
int firstNum = 0, secondNum = 0, result = 0;
char operator =' ';
System.out.println("첫 번째 정수를 입력하세요 : ");
//Scanner 클래스의 sc 객체의 hasNextInt() 메서드는 다음 토큰이 정수인지 여부 확인
if(sc.hasNextInt()) {
firstNum = sc.nextInt();
}
else{
//정수가 아닐 때 BadInputException 예외 클래스 호출
throw new BadInputException("정수가 아닙니다. 정수를 입력하세요.");
}
System.out.println("두 번째 정수를 입력하세요 : ");
if(sc.hasNextInt()) {
secondNum = sc.nextInt();
}
else{
//정수가 아닐 때 BadInputException 예외 클래스 호출
throw new BadInputException("정수가 아닙니다. 정수를 입력하세요.");
}
System.out.println("사칙연산 기호를 입력하세요 : ");
operator = sc.next().charAt(0);
switch(operator) {
case '+': result = firstNum + secondNum; break;
case '-': result = firstNum - secondNum; break;
case '*': result = firstNum * secondNum; break;
case '/': result = firstNum / secondNum; break;
}
//연산자가 나눗셈 and 두 번째 입력받는 수가 0이라면
if(operator == '/' && secondNum == 0) {
throw new BadInputException("나눗셈을 수행할 때, 두 번째 수는 0이 될 수 없습니다."); //예외 처리
}
// 연산자가 +, -, * , / 가 아니라면
if(operator != '+' && operator != '-' && operator != '*' && operator != '/') {
throw new BadInputException("+, -, *, / 해당 연산자만 입력 가능합니다."); //예외처리
}
System.out.println(result);
}
}
🏴☠️ BadInputException
1
2
3
4
5
public class BadInputException extends Exception {
public BadInputException(String message) {
super(message);
}
}
Scanner sc = new Scanner(System.in);
에서sc.hasNextInt()
Scanner 클래스의 sc객체의 hasNetInt() 메서드는 다음 토큰이 정수인지 여부 확인정수가 아닐 경우 해당 오류를 출력하게 함.
- BadInputException 클래스는 예외 클래스인 Exception을 확장함. Exception 클래스의 모든 기능을 상속 받으면서 추가적으로 특정한 종류의 예외를 나타낼 수 있음 -> “확장“의 개념으로 이해!
하나의 생성자를 가지며 이 생성자는 문자열 형태의 메시지를 받아 ‘Exception’ 클래스의 생성자를 호출하여 예외 객체를 생성함.
- main 메서드 우측에
public static void main(String[] args) throws BadInputException
다음과 같이throws BadInputException
을 통해 main 메서드가 BadInputException 클래스와 같은 예외를 발생시킬 수 있다는 것을 나타내줌. 이 말은 main 메서드 내에서 예외가 발생할 수 있다는 것을 컴파일러에게 알려주는 것! 해결(O)
Level 1-4
- 반복문을 사용하여 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스코드 수정
📌main
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
import java.util.Scanner;
public class App {
public static void main(String[] args) throws BadInputException {
Scanner sc = new Scanner(System.in);
int firstNum = 0, secondNum = 0, result = 0;
String operator;
while (true) {
System.out.println("첫 번째 정수를 입력하세요 : ");
if (sc.hasNextInt()) {
firstNum = sc.nextInt();
} else {
throw new BadInputException("정수가 아닙니다. 정수를 입력하세요.");
}
System.out.println("두 번째 정수를 입력하세요 : ");
if (sc.hasNextInt()) {
secondNum = sc.nextInt();
} else {
throw new BadInputException("정수가 아닙니다. 정수를 입력하세요.");
}
System.out.println("연산자를 입력하세요 (exit 입력 시 종료) ");
operator = sc.next();
// 문자열의 입력이 exit 일때 종료
if (operator.equals("exit")) {
break;
}
//연산자에 따라 다른 기능 수행
switch (operator) {
case "+":
result = firstNum + secondNum;
break;
case "-":
result = firstNum - secondNum;
break;
case "*":
result = firstNum * secondNum;
break;
case "/":
if (secondNum != 0) {
//나눗셈
result = firstNum / secondNum;
} else {
System.out.println("나눗셈을 수행할 때, 두 번째 수는 0이 될 수 없습니다.");
continue;
}
break;
default:
//+, -, *, /가 아닌 그 외의 경우
System.out.println("+, -, *, / 해당 연산자만 입력 가능합니다.");
continue;
}
System.out.println("결과: " + result);
}
}
}
- Level 1-3의 if문을 while문으로 묶어서 무한 반복되게 수행, if 문으로 문자열 exit가 입력될 때 break로 종료되게 함 (해결 O)
Level 1-5
- 연산 결과 10개를 저장할 수 있는 배열 선언 및 생성 후 연산 결과 저장
- 연산 결과를 저장할 수 있도록 적합한 타입의 배열 생성
- 연산 결과를 비어있는 곳에 저장하기 위해 저장할 때마다 count
📌main
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
import java.util.Scanner;
public class App {
public static void main(String[] args) throws BadInputException {
Scanner sc = new Scanner(System.in);
int[] results = new int[10];
int firstNum = 0, secondNum = 0, result = 0, index = 0;
String operator;
while(index<10){
System.out.println("첫 번째 정수를 입력하세요 : ");
if (sc.hasNextInt()) {
firstNum = sc.nextInt();
} else {
throw new BadInputException("정수가 아닙니다. 정수를 입력하세요.");
}
System.out.println("두 번째 정수를 입력하세요 : ");
if (sc.hasNextInt()) {
secondNum = sc.nextInt();
} else {
throw new BadInputException("정수가 아닙니다. 정수를 입력하세요.");
}
System.out.println("연산자를 입력하세요 (exit 입력 시 종료) ");
operator = sc.next();
// 문자열의 입력이 exit 일때 종료
if (operator.equals("exit")) {
break;
}
switch (operator) {
case "+":
results[index] = firstNum + secondNum;
break;
case "-":
results[index] = firstNum - secondNum;
break;
case "*":
results[index] = firstNum * secondNum;
break;
case "/":
if (secondNum != 0) {
results[index] = firstNum / secondNum;
} else {
System.out.println("나눗셈을 수행할 때, 두 번째 수는 0이 될 수 없습니다.");
continue;
}
break;
default:
System.out.println("+, -, *, / 해당 연산자만 입력 가능합니다.");
continue;
}
index++;
for(int i=0;i<results.length;i++)
{
System.out.println("결과 "+(i+1)+" : "+results[i]);
}
}
}
}
- 값을 저장할 배열 생성 :
int[] results = new int[10];
Level 1-4의while(true)
일 때 무한 반복을while(index<10)
으로 변경, while문 안에 index++로 증가시킴 -> “10번 반복되면 종료” - 해결 (O)
Level 1-6
- 연산 결과가 10개를 초과하는 경우 가장 먼저 저장된 결과를 삭제하고 새로운 연산 결과가 저장될 수 있도록 수정
- 현재 저장된 index가 마지막(9)라면 가장 먼저 저장된 결과 값이 삭제되고 새로운 결과 값이 마지막 index에 저장될 수 있도록 구현
📌main
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
import java.util.Scanner;
public class App {
public static void main(String[] args) throws BadInputException {
Scanner sc = new Scanner(System.in);
int[] results = new int[10];
int firstNum = 0, secondNum = 0, result = 0, index = 0;
String operator;
while(index<10){
System.out.println("첫 번째 정수를 입력하세요 : ");
if (sc.hasNextInt()) {
firstNum = sc.nextInt();
} else {
throw new BadInputException("정수가 아닙니다. 정수를 입력하세요.");
}
System.out.println("두 번째 정수를 입력하세요 : ");
if (sc.hasNextInt()) {
secondNum = sc.nextInt();
} else {
throw new BadInputException("정수가 아닙니다. 정수를 입력하세요.");
}
System.out.println("연산자를 입력하세요 (exit 입력 시 종료) ");
operator = sc.next();
// 문자열의 입력이 exit 일때 종료
if (operator.equals("exit")) {
break;
}
switch (operator) {
case "+":
result = firstNum + secondNum;
break;
case "-":
result= firstNum - secondNum;
break;
case "*":
result = firstNum * secondNum;
break;
case "/":
if (secondNum != 0) {
result = firstNum / secondNum;
} else {
System.out.println("나눗셈을 수행할 때, 두 번째 수는 0이 될 수 없습니다.");
continue;
}
break;
default:
System.out.println("+, -, *, / 해당 연산자만 입력 가능합니다.");
continue;
}
results[index] = result;
index++;
if (index >= 10) {
//배열의 결과를 한칸씩 앞으로 이동
for (int i = 0; i < results.length - 1; i++) {
results[i] = results[i + 1];
}
results[9] = result;
// index = 9;
}
for (int i = 0; i < index; i++) {
System.out.println("결과"+(i + 1) + " : " + results[i]);
}
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
operator = sc.next();
// exit 입력시 종료
if (operator.equals("exit")) {
break;
}
}
}
}
- 먼저 while(index<10)이므로 index가 10보다 작은동안 반복함. 10번 반복하면서 결과를 index를 증가시켜 results 배열에 저장.
- 배열의 크기는 10이 되어야 하고 배열에 새로운 값을 저장할 때 if문으로 들어감 index>=10 이 될 때 처음 요소부터 마지막 요소까지 한 칸씩 앞으로 이동. 마지막에는 가장 최근의 결과를 배열의 마지막 요소에 저장
- 따라서 배열은 10개의 크기를 유지하게 됨.
index = 9;
를 하는 이유 배열의 크기 10으로 고정(0~9), 배열의 마지막 요소는 항상 가장 최근의 결과를 담게되므로 배열의 마지막 요소를 가리키게 하여 최근에 계산될 결과를 항상 배열의 마지막에 저장할 수 있도록 함.
추가 🕤
- 오늘 시간 관계상 Level 1-6까지 작성하고 나머지는 주말에 채워놓겠습니다! TMI 쓰는 시간이 제일 즐겁네요..
🐱🏍— —🤸🏻♀️ ~~~ 야~호~
This post is licensed under CC BY 4.0 by the author.