카테고리 없음

[부트캠프] TIL 14일차 (10/14)

bibibibibiN 2024. 10. 14. 21:05

1. 학습 목표

 1) 3주차 과제 완성

 2) 오류 및 예외 / 예외 처리 / generic 문법 / wrapper 객체 학습

 3) 프로세스,쓰레드 차이 / 쓰레드의 종류 / 함수형 프로그래밍 / NULL 

 4) 알고리즘 코드카타 1~7번 풀이 

 

2. 학습 내용

 1) 실습 환경 : IntelliJ

 2) JAVA 강의 :

  (1) 3주차 과제

   - operate를 포함하는 추상 클래스에 상속된 연산 클래스들. calculator에서 연산자에 따라 각 연산 클래스의 operate를 사용함.

  (2) 4주차

   - 오류 및 예외 개념 이해 / 예외 처리(try-catch-finally) / 예외 던지기(throws,throw) / generic 개념 / wrapper 객체

  (3) 4주차 과제

   -  Parser에서 입력받은 숫자,연산자가 적합한지 확인(pattern, match) 하고, main에서 CalculatorApp 프로그램 실행 시 try-catch를 통해 정상적으로 프로그램 실행되도록 함.

   (4) 5주차

   - 프로세스,쓰레드 차이 / 쓰레드의 종류 / 함수형 프로그래밍 / NULL

 3) 알고리즘 : 깃허브

 

   

 3. 학습 내용 외 기록

 1) 3주차 과제 계산기 구현 시 정답 코드에는 연산 방식을 지정해주어 좀 더 개선하여 직접 입력 받은 연산자에 대해 적용하는 코드로 구현해보았다.

[정답 코드]

public class Main {
    public static void main(String[] args) {
        Calculator calculator  = new Calculator(new AddOperation());
        System.out.println(calculator.calculate(10, 20));
        calculator.setOperation(new MultiplyOperation());
        System.out.println(calculator.calculate(10,20));
    }
}

[구현 코드]

package week3HW;

import java.util.Scanner;

public class HW3calculator {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("피연산자 2개를 입력하시오 : ");
        int n1 = sc.nextInt();
        int n2 = sc.nextInt();
        sc.nextLine();
        System.out.print("연산자를 입력하시오 : ");
        String op = sc.nextLine();

        switch(op){
            case "+":
                Calculator ca = new Calculator(new AddOperation());
                System.out.println(ca.calculate(n1, n2));
                break;
            case "-":
                Calculator cs = new Calculator(new SubstractOperation());
                System.out.println(cs.calculate(n1, n2));
                break;
            case "*":
                Calculator cm = new Calculator(new MultiplyOperation());
                System.out.println(cm.calculate(n1, n2));
                break;
            case "/":
                Calculator cd = new Calculator(new DivideOperation());
                System.out.println(cd.calculate(n1, n2));
                break;
            default:
                System.out.println("다시 시도하세요.");
        }


    }
}

 

 2) 4주차 과제에서 적용한 Pattern 클래스

  (1) pattern 클래스

   정규 표현식이 컴파일된 클래스. 정규 표현식에 대상 문자열을 검증하거나, 활용하기 위해 사용되는 클래스

  (2) 사용 예시

Pattern pattern = Pattern.compile("\\bflame\\b");
Matcher matcher = pattern.matcher(sonnet);
while (matcher.find()) {
    String group = matcher.group();
    int start = matcher.start();
    int end = matcher.end();
    System.out.println(group + " " + start + " " + end);
}

(3) 과제 코드 적용 일부

import java.util.regex.Pattern;

private static final String OPERATION_REG = "[+\\-*/]";
private static final String NUMBER_REG = "^[0-9]*$";

if (!Pattern.matches(NUMBER_REG, firstInput)) {
            throw new BadInputException("숫자");
        }

 

4. 어려웠던 부분 / 의문점 

 1) 3주차 과제에서 add, substract, 등의 클래스를 따로 생성하고 추상 클래스를 extend 한 이유? 즉, 추상클래스를 생성해서 operate 함수를 상속받아 오버라이딩하는 이유?

 -> 복잡도를 낮춰서 확장을 용이하게 한다는 정도만 찾아보았는데 좀 더 공부해 봐야 겠다.

 2) calculate 안에 쓰면 되는 거 아닌가. 왜 다 분리하는가?

 -> 리팩토링(내부구조 개선하는 것)으로 가독성을 높이고 버그를 줄이는 등의 작업이 필요. 하나의 메서드는 하나의 작업을 하는게 좋음.

3) throw/throws 나 try-catch 뭘 적용하는 게 좋을지, 어떤 곳에서 예외처리가 필요한지 파악하는 방법을 좀 더 공부해 봐야 겠다.

 

5. 오류 및 해결

 

 

6. 다음 학습 내용

1) 계산기 구현 개인 과제 진행

 

7. 회고

개인 과제를 시작하기 위해서 오늘 강의를 끝내고자 좀 빨리 진행하고 싶었다. 뭔가 강의를 냅다 들으면 개념 파악이 확실히 안 된 상태로 실습을 진행하는 것 같아 흐름 파악에 더 오래 걸린다고 생각했다. 그래서 먼저 교안을 열심히 읽어보고 강의를 들으니 오늘 특강이 좀 있었음에도 불구하고 진도를 뺄 수 있었던 것 같다. 나에게 맞는 공부방법을 찾느라 강의를 들으면서 정리도 해보고, 교안 위주로 보며 강의를 참고하는 방법도 해보고 그랬는데 지금 방법이 시간 효율이나 이해도 측면에서 나에게 가장 적합한 듯하다. 

그래도 아직 이해가 될랑 말랑 하는 부분도 꽤 있어서 강의 진도가 끝나고 내가 이해 못한 부분들을 체크하고 확실히 개념을 잡는 시간을 가져야 할 것 같다.