https://computerreport.tistory.com/45
[Java]Lv2 계산기 만들기
https://computerreport.tistory.com/44 [Java]Lv1 계산기 만들기문제1. 양의 정수(0포함)를 입력받기 2. 사칙연산기호(+,-,*,/)를 입력 받기 3. 위에서 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산
computerreport.tistory.com
Lv2까지 계산기를 사용하기 위한 필수 기능들을 구현하였고 이젠 실무에서 자주 사용하는 문법과 클래스를 적용 시켜 볼려고 한다.
이번 단계에서 중점으로 생각해야 하는 것들은 유지 보수와 재사용성이 용이 하도록 코드를 최적화 시키는데 있다.
물론 가독성까지 좋아진다.
문제: Enum, 제네릭, 람다 & 스트림을 이해한 계산기 만들기
✅ 1. 4가지 연산자 (+ , - , * , /) 들을 Enum 타입에 적용시켜 연산자 타입을 관리하기
Enum이라는 개념을 잘 숙지하지 못해 따로 블로그에 정리 하였다.
https://computerreport.tistory.com/47
[Java]Enum이란? & 사용법
Enum이란?코딩을 작성할때 우리는 대부분 이런식으로 상수를 정의한다.final static int A = 0;String B = "abc"; 이렇게 정의를 하다보면 다양한 문제가 발생한다.그래서 자바 1.5버전부터 새로 추가된 클
computerreport.tistory.com
OperatorType.java
package calculate;
//연산자의 종류를 정의하는 열거형 클레스
public enum OperatorType {
ADD("+"),
SUBTRACT("-"),
MULTIPLY("*"),
DIVIDE("/");
private final String symbol; //입력받을 연산자 기호
private final Calculate calculate = new Calculate();
//생성자:연산자 기호 설정
OperatorType(String symbol) {
this.symbol = symbol;
}
//연산자의 기호를 반환하는 게터
public String getSymbol() {
return symbol;
}
//입력받은 기호와 동일한 연산자 타입을 찾는 메서드
public static OperatorType matchOperatorType(char symbol) {
for (OperatorType operatorType : OperatorType.values()) { //모든 Enum값 순환
if (operatorType.getSymbol().charAt(0) == symbol) { //일치하는지 확인
return operatorType;
}
}
throw new IllegalArgumentException("유효하지 않은 연산자입니다: " + symbol);
}
//첫번째 숫자와 두번쨰숫자의 연산을 수행하는 메서드
public int operate(int firstNumber, int secondNumber) {
if(ADD.getSymbol().equals(symbol)) {
return calculate.Add(firstNumber,secondNumber);
}
if(SUBTRACT.getSymbol().equals(symbol)) {
return calculate.Sub(firstNumber,secondNumber);
}
if(MULTIPLY.getSymbol().equals(symbol)) {
return calculate.Mul(firstNumber,secondNumber);
}
if(DIVIDE.getSymbol().equals(symbol)) {
return calculate.Div(firstNumber,secondNumber);
}
throw new IllegalArgumentException("유효하지 않은 연산자입니다: " + symbol);
}
}
이전 CalculatorApp.java
//입력한 연산자에 따라 메서드 호출
if (operator == '+') {
result = calculator.add(firstNumber, secondNumber);
} else if (operator == '-') {
result = calculator.Sub(firstNumber, secondNumber);
} else if (operator == '*') {
result = calculator.Mul(firstNumber, secondNumber);
} else if (operator == '/') {
result = calculator.Div(firstNumber, secondNumber);
}
↓
변경된 CalculatorApp.java
//입력한 연산자에 따라 메서드 호출
OperatorType operatorType= OperatorType.matchOperatorType(operator);
int result = operatorType.operate(firstNumber, secondNumber);
✅ 2. 저장된 연산 결과들 중 Scanner로 입력받은 값보다 큰 결과값 들을 출력(Lamda,스크림 이용)
우선,연산 결과들을 List에 추가하는 메소드를 구현하였다.
OperatorType.java
//결과 리스트 생성
private final List<Integer> arrayList = new ArrayList<>();
//결과 리스트 추가(세터)
public void setResult(int result) {
this.arrayList.add(result);
}
그리고 입력한 숫자들을 입력과 현재 리스트에 있는 결과를 비교하여 결과가 더 큰 값만 출력하도록 메소드를 구현하였다.
새로운 리스트를 그 안에 만들어 더 큰 값들만 리스트에 추가하도록 하였다.
//람다식과 스트림을 활용하여 입력한 값보다 높은 결과값 출력
public void UpResult(int FirstNum, int SecondNum) {
List<Integer> filteredArr = arrayList.stream()
.filter(num -> FirstNum < num)
.filter(num -> SecondNum < num)
.collect(Collectors.toList());
System.out.println(filteredArr);
}
⚠️ ⚠️ ⚠️ 문제가 발생했다 ⚠️ ⚠️ ⚠️
처음값은 잘 입력되고 리스트에 추가가 된다. 그런데 한번더 입력하게 되면
이와 같이 첫번째 인덱스값이 사라진다... 왜이런걸까
해결한 방법은 생성자 위치를 재배치 한걸로 해결하였다.
while문안에
//입력한 연산자에 따라 메서드 호출
OperatorType operatorType = OperatorType.matchOperatorType(operator);
int result = operatorType.operate(firstNumber, secondNumber);
OperatorType 생성을 넣어서 클래스 안에있는 리스트 또한 초기화 되는것이였다.
그래서
Scanner sc = new Scanner(System.in);
OperatorType operatorType;
while (true) {
이런식으로 밖에 정의를 하니 리스트가 초기화 되지않고 순서별로 저장됐다!!!
'TIL' 카테고리의 다른 글
[TIL]키오스크 만들기(2025-03-14) (0) | 2025.03.14 |
---|---|
[TIL]키오스크 만들기(2025-03-12) (1) | 2025.03.12 |
[TIL]키오스크 만들기(2025-03-10) (0) | 2025.03.10 |
[TIL]Lv2 계산기 만들기(2025-02-26) (0) | 2025.02.26 |
[TIL]Lv1 계산기 만들기(2025-02-25) (0) | 2025.02.25 |