TIL (Today I Learned)

[TIL] 부트캠프 3주-1일차 / 과제 트러블슈팅 포함 + 피드백 추가

바토파 2024. 9. 9. 21:50
반응형

[계산기 과제]

https://github.com/ethrad/Java_Calculator/tree/main/src/Homework

 

도전 기능만 작성함.

 

App.java 

import java.util.Scanner;

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

        while (true) {
            double firstNumber;

            // 올바른 수를 입력 받을 때까지 반복
            while (true) {
                System.out.print("첫 번째 숫자를 입력하세요: ");
                try {
                    String firstInput = sc.nextLine();
                    firstNumber = parser.parseNumber(firstInput);
                    break;
                } catch (BadInputException e) {
                    System.out.println(e.getMessage());
                }
            }

            char operator;

            // 올바른 기호를 입력 받을 때까지 반복
            while (true) {
                System.out.print("사칙연산 기호를 입력하세요: ");
                try {
                    String operatorInput = sc.nextLine();
                    operator = parser.parseOperator(operatorInput);
                    break;
                } catch (BadInputException e) {
                    System.out.println(e.getMessage());
                }
            }

            double secondNumber;

            // 올바른 수를 입력 받을 때까지 반복
            while (true) {
                System.out.print("두 번째 숫자를 입력하세요: ");
                try {
                    String secondInput = sc.nextLine();
                    secondNumber = parser.parseNumber(secondInput);
                    break;
                } catch (BadInputException e) {
                    System.out.println(e.getMessage());
                }
            }

            // 계산 후 오류가 나면 오류 출력
            try {
                System.out.println(calc.calculate(firstNumber, secondNumber, operator));
            }
            catch (ArithmeticException e){
                System.out.println(e.getMessage());
            }

            // 계산 결과 중 입력 받은 값보다 큰 값을 출력
            while (true) {
                System.out.print("입력 값보다 큰 값을 출력합니다: ");
                try {
                    double num = parser.parseNumber(sc.nextLine());
                    calc.getResult().stream()
                            .filter(e -> num < e)
                            .forEach(e -> System.out.println(e + " "));

                    break;
                } catch (BadInputException e) {
                    System.out.println(e.getMessage());
                }
            }

            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");

            String answer = sc.nextLine();
            if (answer.equals("exit")) {
                break;
            }
        }
    }
}

 

* stream

  • 작성하는 게 헷갈렸는데 C# LINQ랑 비슷한 느낌이라 한 번 이해하고 나니 잘 사용할 수 있었다.
  • 유용한 기능이 많아 보이니 기억해둬야겠다.

 

OperatorType.java

public enum OperatorType {
    PLUS('+') {
        public double apply(double a, double b) {
            return a + b;
        }
    },
    MINUS('-') {
        public double apply(double a, double b) {
            return a - b;
        }
    },
    MULTIPLY('*') {
        public double apply(double a, double b) {
            return a * b;
        }
    },
    DIVIDE('/') {
        public double apply(double a, double b) {
            if (b == 0) {
                throw new ArithmeticException("0으로 나눌 수 없습니다.");
            }

            return a / b;
        }
    };

    private final char symbol;

    OperatorType(char s) {
        symbol = s;
    }

    public static OperatorType findType(char symbol) {
        for (var op : OperatorType.values()) {
            if (op.symbol == symbol) {
                return op;
            }
        }

        throw new IllegalArgumentException("매개변수가 올바르지 않습니다.");
    }

    public abstract double apply(double a, double b);
}

 

* Enum

  • C#에서 사용해봤던 기능이라 비슷할 줄 알았는데 많이 달라서 놀랐다.
  • 기능을 이해하긴 했는데 활용 방법을 잘 모르겠다.

 

아래는 어려운 부분에 대한 답변입니다.

> 기능을 어떤 기준으로 분리하면 좋을지 고민했습니다.

OOP에서 기능을 나누려면 기능이 결국 하나의 객체가 되는 경우가 많아요.
그래서 요구사항을 만족하는 시스템을 설계할 때, 어떤 객체들을 식별해야하는지 먼저 나열해보세요.
그리고 그 객체들의 역할과 책임 범위를 설계해보세요. 이 때 최소한의 작은 단위의 책임만 갖도록 설계해보세요.
객체, 시스템 설계에 대한 정답은 없기에 일단 처음엔 최소한의 작은 책임을 갖는 객체를 설계한다 생각하면 설계하는데 큰 도움되실꺼에요.

---
아래는 프로젝트에 대한 코멘트입니다.

1. 요구사항에 맞는 계산기 동작에 대해서 잘 구현해주셨어요.
이제는 코드 가독성에 대해서 올리기 위해 https://www.baeldung.com/java-streams 문서를 한번 정독해보시고 적용해보는것을 추천드립니다!

2. TIL도 잘 작성해주셨네요.
지금처럼 어떤 문제가 발생했을 때만 작성하는게 아닌 구현하면서 느꼈던점, 어려웠던점, 배웠던점 등을 꾸준히 작성해주시면 됩니다.
이런 자료들으 추 후 다운님의 포트폴리오에 크게 도움될거예요.
화이팅입니다!

3. 디렉토리 설정
현재 주차별로 디렉토리로 나누어서 관리하고있는거같은데, 
앞으로는 주차별로 했던 내용들은 다른 브랜치로 관리하거나 다른 저장소로 빼는게 좋을거같습니다.
처음 저장소를 진입했을 때, 어떤 부분을 확인해야하는지 명확하지않았어요.

4. git readme 작성도 굉장히 중요합니다. 
앞으로 프로젝트 진행해주실 때 시스템 실핼 방법, 트러블 슈팅에 대한 내용, 신경썻던 부분 등에 대해서 작성해주시면 협업자 입장에서 큰 도움이 됩니다.
추가로, 깃 커밋 컨벤션도 잘 맞춰주시면 협업자 간 문제를 신속하게 파악하고, 추적하는데 굉장히 큰 역할을 합니다.
https://www.conventionalcommits.org/en/v1.0.0/ 문서를 정독해보시고 앞으로 커밋 쌓으실 때 신경써서 적용해보세요.

 


 

[오늘 한 일]

  • 알고리즘 문제 풀기 & 코드 리뷰

- 오늘 푼 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42885

- 정렬 후에 인덱스 2개 사용해서 풀었다.
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> people, int limit) {
    int answer = 0;
    
    sort(people.begin(), people.end());
    
    int first_index = 0;
    int second_index = people.size()-1;
    
    while (first_index <= second_index){
        if (people[first_index] + people[second_index] <= limit){
            first_index++;
            second_index--;
        }
        else{
            second_index--;
        }
        
        answer++;
    }
    
    return answer;
}​

 

  • Java 강의 과제 하기
  • 계산기 과제 하기
  • 계산기 과제 제출

 

[내일 할 일]

  • 알고리즘 문제 풀기
  • Java 강의 다 듣기
  • SQL 강의 다 듣기
  • 공부 계획 세우고 자료 찾아보기
반응형

'TIL (Today I Learned)' 카테고리의 다른 글

[TIL] 부트캠프 3주-3일차  (0) 2024.09.11
[TIL] 부트캠프 3주-2일차  (0) 2024.09.11
[TIL] 부트캠프 2주-5일차  (0) 2024.09.06
[TIL] 부트캠프 2주-4일차  (0) 2024.09.05
[TIL] 부트캠프 2주-3일차  (0) 2024.09.04