
자바 클래스를 이용해 사용자에게 피연산자를 입력받아 사칙연산을 실행하고 결과를 보여주는 계산기 프로그램입니다.
2025.1.2~2025.1.10 8일
IntellyJ IDEA
JAVA
corretto 17.0.3
Gradle
- Scanner.nextDouble()로 정수 입력받기
- Scanner.nextLine()으로 String형 입력받은 후
CharAt(0)으로 한글자만 처리
- switch(char c) 문으로
case '+': 기호별로 구분한 후
result=a+b; 연산 실행
while(true)문으로 무한으로 돌린 후
if (operation.equals("exit")) { if문으로 입력받은 문자가 exit인 경우
System.out.println("끝");
break; } break; 로 while문 빠져나가기

public class App {
Calculator calculate = new Calculator();
| 자료형 | 역할 |
|---|---|
| int result | 계산 결과값을 저장 |
| ArrayList resultArray | 결과값을 모은 배열 |
Calculator calculate = new Calculator(); 메인에서 Calculator 클래스를 생성 후
...
result = calculator.calculate(a, b, symbol); Scanner로 입력받은 인자를 계산 함수 calculate에 매개변수로 넘겨 결과값을 반환받는다.
App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는 컬렉션 필드에 직접 접근하지 못하도록 수정 (캡슐화)
필드 앞에 private 명령어를 사용해 접근하지 못하도록 하고,
Calculator allResult() 함수를 통해 결과값들을 불러옴
Calculator{
private int result;
private ArrayList<Integer> resultArray;
....
void allResult(){
System.out.println(resultArray.toString());
}
Main{
...
calculator.allResult();
Calculator 클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현한 후 App 클래스의 main 메서드에 삭제 메서드가 활용될 수 있도록 수정
arrayList.remove(0)을 써서 가장 먼저 앞에 있는 결과값 삭제하도록 함.
삭제 후에는 뒤의 인자가 0번으로 오기 때문에 인덱스 값을 (0)으로 지정해도 상관없음.
void removeResult () {
resultArray.remove(0);
System.out.println("삭제됐습니다.");
}
...
main{
for(int i=0;i<num;i++) {
System.out.println("삭제하시겠습니까? (y:예 n:아니오):");
operation = sc2.nextLine();
if (operation.equals("y")) {
calculator.removeResult();
calculator.allResult();
}// 가장 먼저 저장된 연산결과 삭제하기



public enum OperatorType{
PLUS("+", (x, y) -> x + y),
MINUS("-", (x, y) -> x - y),
MULTI("*", (x, y) -> x * y),
DIVIDE("/", (x, y) -> x / y);
실수, 즉 double 타입의 값을 전달 받아도 연산이 수행하도록 만들기
제네릭을 이용해 main에서 어떤 자료형을 입력받아도 상관없도록 T로 묶은 후 doubleValue()로 double형으로 변환 후 계산
class ArithmeticCalculator{
public <T extends Number> double calculate(T a, T b, char symbol) {
OperatorType ot;
this.x=a.doubleValue();
this.y=b.doubleValue();
main{
calculator.xResult(x);
class ArithmeticCalculator{
...
void xResult(int i){
ListView lv=new ListView();
lv.getXList(resultArray,i);
}
class ListView{
...
public void getXList(ArrayList<Operation> allList, int x){//전체 리스트를 받은 후
allArrayList=allList;//현재 리스트에 넣고
this.x=x;
xArrayList.addAll(addXList(allArrayList,x));//매개변수로 넘겨서 x값 이상의 결과값을 구하는 함수를 실행해 값을 구해서
printList(xArrayList);//출력함수를 통해 출력한다.
}
1.사용자는 피연산자 두개, 사칙연산 기호를 입력한다.

2.연산결과를 출력한다.

3.다시 계산하고 싶으면, 0 아니면 exit를 입력해 계산을 종료한다.
(exit를 입력할 때까지 무한으로 반복)

4.exit를 입력해 계산을 끝내면 모든 연산들을 보여준다.

5.보고 싶은 연산식의 번호를 입력하면 그 계산식만 보여준다.

6.수정하고 싶은 연산번호와 연산기호를 입력하면,
프로그램은 새로운 연산기호로 해당번호의 연산식을 다시 계산해서 출력한다.

7.삭제여부를 물어봤을 때 y를 입력하면 맨 앞의 계산식이 사라지고 출력,
모든 연산들이 없어질 때까지 반복해서 질문이 뜬다.
n을 입력하면 더는 삭제하지 않고 종료한다.

8.계산기를 종료한다.

1.enum,제네릭,람다&스트림 개념이 생소해서 강의 복습과 검색을 통해 익히느라 애를 먹었고, 실전에서 과제 의도대로 효율적으로 쓰지 못해 아쉬웠다.
2.클래스/메소드 별로 기능을 나눌 때 미리 다이어그램을 작성해놓지 않으면 기능이 중첩되기 쉬어 코드가 비효율적으로 작성됨을 알게됐다. 생각나는 대로 구현을 한 것이 오히려 시간이 많이 걸렸다.
3.의외로 환경설정에서도 에러가 많이 나서, 검색하면서 많이 고쳤다.
4.단순히 메소드 종류만 안다고 되는 것이 아니라, 자바의 기존 함수를 사용할 때는 내가 생각지도 못한 제한이나 규칙이 많아서 일단 하는 것보단, 함수에 자세히 공부하고 메소드를 쓰는 것이 더 바람직하다는 것을 느꼈다.