Post

TIL-Calculator 개인 과제 정리

TIL-Calculator 개인 과제 정리

2024-05-01

오늘의 학습 🌠


1

개인 과제 정리 📃


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개의 크기를 유지하게 됨.

1

  • index = 9;를 하는 이유 배열의 크기 10으로 고정(0~9), 배열의 마지막 요소는 항상 가장 최근의 결과를 담게되므로 배열의 마지막 요소를 가리키게 하여 최근에 계산될 결과를 항상 배열의 마지막에 저장할 수 있도록 함.

추가 🕤


  • 오늘 시간 관계상 Level 1-6까지 작성하고 나머지는 주말에 채워놓겠습니다! TMI 쓰는 시간이 제일 즐겁네요..

1

🐱‍🏍— —🤸🏻‍♀️ ~~~ 야~호~

This post is licensed under CC BY 4.0 by the author.