자바

계산기 만들기 enum,람다,스트림 활용

148june 2025. 2. 28. 14:30

enum

public enum Enum {
            Add {
                @Override
                public double apply(double first, double second) {
                    return first + second;
                }
            },

            MINUS {
                @Override
                public double apply(double first, double second) {
                    return first - second;
                }
            },
            multiply {
                @Override
                public double apply(double first, double second) {
                    return first * second;
                }
            },

            DIVIDE {
                @Override
                public double apply(double first, double second) {
                    return first / second;
                }
            };
    }
  • enum으로 지정하여 넣을수있음
  • 람다식을 활용하면 효과적으로 줄일수있음

람다

public enum Enum {
        ADD((first, second) -> first + second),
        MINUS((first, second) -> first - second),
        MULTIPLY((first, second) -> first * second),
        DIVIDE((first, second) -> first / second);

        private final Operation operation;

        Enum(Operation operation) {
            this.operation = operation;
        }

        public double apply(double first, double second) {
            return operation.apply(first, second);
        }
   }
  • ADD, MINUS, MULTIPLY, DIVIDE를 각각 정의
  • 생성자로 람다식(Operation 인터페이스 사용)을 받아서, 연산을 수행하는 방식
  • apply() 메서드를 통해 각 연산을 실행할 수 있음

스트림

//스트림 부분
        public static double calculate(String operation, double first, double second) {
            return Arrays.stream(Enum.values())
                    // Enum 값들 가져오기
                    .filter(op -> op.name().equalsIgnoreCase(operation))
                    // 입력값과 일치하는 연산 찾기
                    .findFirst()
                    //연산자가져오기 숫자first랑 헷갈릴수 있는 문제잇음 변수명 수정 필요할거같다
                    .orElseThrow(() -> new IllegalArgumentException("잘못된 연산자: " + operation))
                    // 예외 처리
                    .apply(first, second);
                    //작동부분
        }

 

전체코드도 이걸 적용할수있게 바꿔주면

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

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

        while (true) {
            System.out.println("첫번째 숫자를 입력하시오: ");
            double first = sc.nextDouble();
            System.out.println("두번째 숫자를 입력하시오: ");
            double second = sc.nextDouble();
            //아래에서 double을 사용하게 위해 여기서도 double로 통일해주기
            System.out.println("사칙연산 입력 (ADD, MINUS, MULTIPLY, DIVIDE 대문자여야함): ");
            String operator = sc.next();

            double sum = cal.calculate(first, second, String.valueOf(operator));

            System.out.println("결과: " + sum);

            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료,exit외 값 입력시 반복)");
            String input = sc.next();
            if (input.equals("exit")) {
                System.out.println("계산기를 종료합니다.");
                break;
            }

        }
        //whlie끝남
        sc.close();
    }

    public static class Cal {

        // 컬렉션 sums임 sum이랑 착각 ㄴㄴ
        private List<Double> sums = new ArrayList<>();

        //첫번쨰숫자,두번째 숫자, operator는 연산자라는뜻
        //int first이런식이였으나 Number채용후 .doubleValue로 바꿀수잇게함
        public double calculate(Number first,Number second, String operator) {
            try {
                double sum = Enum.calculate(operator, first.doubleValue(), second.doubleValue());
                sums.add(sum); // int 리스트에 저장할 수 있도록 변환
                return sum;
            } catch (IllegalArgumentException e) {
                System.out.println(e.getMessage());
                return Double.NaN;
            }
        }

        // Getter
        public List<Double> getSums() {
            return sums;
        }

        // 연산 결과를 삭제
        public void removeSum() {
            if (!sums.isEmpty()) {
                sums.remove(0);
            }
        }

        // Setter
        public void setSums(List<Double> sums) {
            this.sums = sums;
        }
    }

    /* enum만 사용한 코드
    public enum Enum {
            Add {
                @Override
                public double apply(double first, double second) {
                    return first + second;
                }
            },

            MINUS {
                @Override
                public double apply(double first, double second) {
                    return first - second;
                }
            },
            multiply {
                @Override
                public double apply(double first, double second) {
                    return first * second;
                }
            },

            DIVIDE {
                @Override
                public double apply(double first, double second) {
                    return first / second;
                }
            };
    }
    */
//람다와 enum을 합친코드
    @FunctionalInterface
    interface Operation {
        double apply(double first, double second);
    }

    public enum Enum {
        ADD((first, second) -> first + second),
        MINUS((first, second) -> first - second),
        MULTIPLY((first, second) -> first * second),
        DIVIDE((first, second) -> first / second);

        private final Operation operation;

        Enum(Operation operation) {
            this.operation = operation;
        }

        public double apply(double first, double second) {
            return operation.apply(first, second);
        }
        //스트림 부분
        public static double calculate(String operation, double first, double second) {
            return Arrays.stream(Enum.values())
                    // Enum 값들 가져오기
                    .filter(op -> op.name().equalsIgnoreCase(operation))
                    // 입력값과 일치하는 연산 찾기
                    .findFirst()
                    //연산자가져오기 숫자first랑 헷갈릴수 있는 문제잇음 변수명 수정 필요할거같다
                    .orElseThrow(() -> new IllegalArgumentException("잘못된 연산자: " + operation))
                    // 예외 처리
                    .apply(first, second);
                    //작동부분
        }
    }

}

 트러블 슈팅

  • 제너릭을 활용해서 짯어하는데 number로 착각하여 코드 작성
  • 중간에 기존 부분과 헷갈려서 제작에 착각

 

고칠점

  • 제너릭 부분생성하기
  • 침착하게 글을 읽고 작성해보기