자바
계산기 만들기 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로 착각하여 코드 작성
- 중간에 기존 부분과 헷갈려서 제작에 착각
고칠점
- 제너릭 부분생성하기
- 침착하게 글을 읽고 작성해보기