저번주 부터 시작된 개인과제를 이제야 시작해보려고 한다.

왜냐하면 level 2 부터 직면한 클래스부터 예외처리 부분이 강의를 들어도 도저히 와닿지 않았기 때문.
그래서 하루에 1주차씩 들어야했던 강의를 지난하게 끌어서 듣고 들었다.
아직도 이해가 안되긴 하지만 어쨌든 하기는 해야하니까.


드디어 만들어보는 과제.package 벌써부터 이렇게 하는게 맞나 의문이다. 프로젝트를 새로 파는건 아닌지, 이거 깃연동은 어떻게 하는지, 일단 고민에 침몰하기 전 시작부터 해보자.


어쨌든 만들었다. 새하얀 도화지를 보니까 두근두근 거리기도 하는데 한 편으로는 망망대해를 마주한것 처럼 막막한 마음도 있다.

Level 1. 요구사항

1. 양의 정수 2개를 각각 입력받기.

Scanner를 이용한 아주 쉬운 입력문을 만들어보자.

import java.util.Scanner;

scanner를 갖다 쓸수 있게 import하고,

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("첫 번째 숫자를 입력하세요: ");
        int firstNumber = sc.nextInt();
        System.out.print("두 번째 숫자를 입력하세요: ");
        int secondNumber = sc.nextInt();
    }

그냥 적당히 변수이름에 정수형으로 선언해서 입력받기.
와 너무 쉽다!

2. 사칙연산 기호 전달 받기.

마찬가지로 scanner를 이용해 +, -, *, / 를 입력받자.

System.out.print("사칙연산 기호를 입력하세요: ");
String operator = sc.nextLine();

중간 지점인 지금. 잘 입력받고 있는지 확인하기 위해서 변수들을 출력해보자.

System.out.println("첫 번째 입력 값: " + firstNumber);
System.out.println("두 번째 입력 값: " + operator);
System.out.println("세 번째 입력 값: " + secondNumber);


내가 이럴줄 알았다. 하여간 한번에 되는게 하나도 없다. 전에 다뤘던 입력시 엔터키로 인한 줄바꿈 때문에 두번째 입력이 곧바로 넘어가는 것 같다. 그래서 입력을 한 줄 추가.

System.out.println("첫 번째 숫자를 입력하세요: ");
int firstNumber = sc.nextInt();
sc.nextLine(); //추가됨.


고비를 넘겼다. 아주 위험했다.

3. 세개의 입력 값으로 사칙연산을 수행.

입력된 연산자에 따라 조건을 나눠 연산을 하고, 결과값을 출력하는 것 까지.

int result = 0;

        switch (operator) {
            case "+" : result = firstNumber + secondNumber;
                break;
            case "-" : result = firstNumber - secondNumber;
                break;
            case "*" : result = firstNumber * secondNumber;
                break;
            case "/" :
                if(secondNumber != 0) {
                    result = firstNumber / secondNumber;
                } else {
                    System.out.println("0으로 나눌수 없습니다.");
                    result = -1;
                }
                break;
            }
        System.out.println("결과: " + result);


아주 깔끔한 결과.

4. 반복문을 걸어 계산을 하고싶을 때까지 할수 있도록.

boolean flag = true;
        while (flag) {
        
        ...상위 코드...
        
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
            if (sc.nextLine().equals("exit")) {
                flag = false;
            } // 루프 탈출
        }

5. 연산결과 10개를 저장할 배열

배열을 선언하면서 while문 속에서 인덱스역할을 할 변수도 선언.

int[] resultArray = new int[10];
int i = 0;
while(flag) {
	...
    
    i++;
    resultArray[i] = result;
    }

6. 연산 결과가 10개를 초과하는 경우 가장 먼저 저장된 결과를 삭제하고 새로운 연산 결과가 저장될 수 있도록 소스 코드를 수정

			...

            i++;
            if (i == resultArray.length) {
                for (int j = 0; j < resultArray.length - 2; j++) {
                    resultArray[j] = resultArray[j + 1];
                } // 값을 앞으로 한칸씩 이동, 마지막 [9] 위치는 if문 바깥에.
            }
            resultArray[i] = result; // 여기
          	
            ...

7. 연산 결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정

값 삭제시, 먼저 들어가 있던 값을 내보내면서 저장하는 건, 자료구조 중 큐(Queue)의 형태다.

import java.util.LinkedList;
import java.util.Queue;

Queue를 활용하기 위한 패키지 import,

Queue<Integer> numQ = new LinkedList<Integer>();

Queue 선언. <>에 자료형을 넣지 않으면 값의 자료형에 구애받지 않는다.

numQ.add(result);
...
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
if(sc.nextLine().equals("remove")) {
       numQ.remove();
   }

Queue에 내장된 remove() 메소드 하나면 선입선출 가능.

8. “inquiry”라는 문자열이 입력되면 저장된 연산 결과 전부를 출력합니다.

  • foreach문을 이용해 구현
            System.out.println("저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
            if(sc.nextLine().equals("inquiry")) {
                for (int num : numQ) {
                    System.out.println(num);
                }
            }

여기까지가, level 1의 구현이었다. level 2 부터 시작되는 클래스는 나에게 어떤 고통을 안겨줄지 기대된다. 내일 TIL을 쓸수 있을까? 나는 살아남을 수 있을까?

profile
둘뺌

0개의 댓글

관련 채용 정보