10.16 TIL Lv. 2 계산기 만들기

JangUT·2024년 10월 16일

오늘은 계산기를 만드는 과제를 진행해 보겠습니다.

클래스를 만들어 연산과 연산 결과 값을 저장하는 컬렉션 타입 필드를 가진 Calcultor를

생성하고 직접 접근이 아닌 간접 접근으로 클래스에 접근하여 값을 수정 or 저장 할 수 있도록

구현하고, 마지막으로 가장 먼저 저장된 데이터를 삭제하는 기능을 구현 해보겠습니다.

먼저 예시 코드를 보시면

public class Calculator {}

라는 Calculator 클래스를 생성해 줍니다.

그리고 반환타입이 있는 calculate 메서드를 만들고 사칙연산을 구현해 보겠습니다.

public class Calculator { 


public double calculate(int num1, int num2, char operation) {
    double answer = 0;

    switch (operation) {
        case '+':
            answer = num1 + num2;
            break;
        case '-':
            answer = num1 - num2;
            break;
        case '*':
            answer = num1 * num2;
            break;
        case '/':
            if (num2 == 0) {
                System.out.println("0으로는 나눌 수 없습니다.");
            }
            answer = num1 / num2;
            break;
        default:
            System.out.println("+, - ,*, / 만 입력하십시오");

switch를 사용해서 사칙연산을 구현해 보았습니다.

트러블 슈팅 : 해당 과정에서는 크게 어려웠던점은 없었습니다.

그럼 다음으로 저장 컬렉션 타입을 입력해 보겠습니다.

public class Calculator {

public ArrayList<Double> doubles = new ArrayList<Double>();

ArrayList를 사용하여 저장 할 수 있는 장소를 구현했습니다.

트러블 슈팅 : 해당 과정에서는 막상 어디에 컬렉션을 만들어야 할지 막막했는데

찾아본 결과 생각보다 너무 간단하게 class안에 해당 컬렉션 타입을 생성해서 해결했습니다.

Lv1에서 구현한 App클래스의 main 매서드에
Calculator 클래스가 활용될 수 있도록 수정하는 과정을 진행합니다.

먼저 App 클래스에서 Calculator 클래스 접근 할수 있도록

Calculator 클래스에서 App 클래스에 인스턴스를 생성해 줍니다.

   Calculator calc = new Calculator();

이제 App클래스에서 Calculator클래스로 접근해서

calculate 메서드에 접근합니다.

Calculator 클래스에 double 반환타입 Calculate를 보시면

매개변수가 int, int, char 타입입니다.

public class Calculator { 
 
public double calculate(int num1, int num2, char operation) {
      
}

calculate 메서드에 접근하려면 다음과 같이
생성된 인스턴스에 변수를 입력해서 메서드 연산을 가져옵니다.

calc.calculate(num1, num2, operation)

해당 값을 double타입에 변수로 출력한다.

double result = calc.calculate(operation, num1, num2);
System.out.println(" 결과 : " + result);

이제 연산과정을 한번 보면
Scanner 입력 -> calc.calculate 연산 수행 -> result 출력

       Scanner sc = new Scanner(System.in);
        System.out.print("첫 번째 숫자를 입력하세요 : ");
        
       int number1 = sc.nextInt();
        System.out.print("두 번째 숫자를 입력하세요 : ");
        
        int number2 = sc.nextInt();
        double result = 0;
        
        System.out.print("사칙연산 기호를 입력하세요 : ");
        char operation = sc.next().charAt(0); 
        
        double result = calc.calculate(operation, num1, num2);
        System.out.println(" 결과 : " + result);
      
 
 

 

Calculator 클래스 내에 calculate 메서드 구현은 다음과 같습니다.

  public class Calculator { 
 
  public double calculate(int num1, int num2, char operation) {
    double answer = 0;

    switch (operation) {
        case '+':
            answer = num1 + num2;
            break;
        case '-':
            answer = num1 - num2;
            break;
        case '*':
            answer = num1 * num2;
            break;
        case '/':
            if (num2 == 0) {
                System.out.println("0으로는 나눌 수 없습니다.");
            }
            answer = num1 / num2;
            break;
        default:
           System.out.println("+, - ,*, / 만 입력하십시오");

다음은 저장된 필드 값을 확인을 해보겠습니다.

public class Calculator {

 public ArrayList<Double> doubles = new ArrayList<Double>();
 

ArrayList 컬랙션을 생성해주고 마찬가지로
아까 생성한 인스턴스를 App클래스 Calculator 클래스에서 접근한다.

calc.doubles 가져와서

System.out.println("저장 목록 확인 : " + calc.doubles);

으로 확인한다.

실제 결과 값을 확인 해보겠습니다.

첫 번째 숫자를 입력하세요: 
5
두 번째 숫자를 입력하세요: 
10
사칙연산 기호를 입력하세요: 
+
결과 : 15.0

더 계산하시겠습니까? (exit  입력 시 종료)
가장 먼저 저장된 데이터를 삭제하시겠습니까? (remove 입력 시 삭제)

저장 목록 확인 : [15.0]

튜러블 슈팅 : 연산 수행 역할을 Calculator 클래스가 수행해야 하는데

App클래스에서 어떤 연관을 지어야 Calculator 클래스에서 수행하는지가

어려웠는데 생성된 인스턴스에 매개변수에 데이터 타입은 빼고 변수만 집어넣었는데

오류발생이 없어져서 변수를 새로 설정하고 sout 출력으로 구현했습니다.

다음은 직접 접근 할 수 없으니 Getter, Setter 메서드로 구현해보겠습니다.

public class Calculator {

   private ArrayList<Double> doubles = new ArrayList<Double>();
   
 public ArrayList<Double> getDoubles() {
        return doubles;
    }
public void setDoubles(ArrayList<Double> doubles) {
       this.doubles = doubles;
   }

이제 App 클래스에서 Calculator 클래스로 간접 접근하여 인스턴스를 생성합니다.

public class App {
 	ArrayList<Double> Array = calc.getDoubles();
 	System.out.println("저장 목록 확인 : " + Array);
 
  }

해당 과정을 실제 구현으로 보여드리겠습니다.

첫 번째 숫자를 입력하세요: 
1
두 번째 숫자를 입력하세요: 
1
사칙연산 기호를 입력하세요: 
+
결과 : 2.0

더 계산하시겠습니까? (exit  입력 시 종료)
가장 먼저 저장된 데이터를 삭제하시겠습니까? (remove 입력 시 삭제)

저장 목록 확인 : [2.0]

d
첫 번째 숫자를 입력하세요: 
5
두 번째 숫자를 입력하세요: 
5
사칙연산 기호를 입력하세요: 
/
결과 : 1.0

더 계산하시겠습니까? (exit  입력 시 종료)
가장 먼저 저장된 데이터를 삭제하시겠습니까? (remove 입력 시 삭제)

저장 목록 확인 : [2.0, 1.0]

튜러블 슈팅 : Getter, Setter 메서드를 실행하는데 어려움이 있었다.

일단 강의 내용을 복습하고 이 둘에 구현 모양을 그대로 따라했다.

getter 같은 경우는

public 타입과 get변수명(첫글자 대문자) () {

}

Setter 같은 경우는

public void set변수면(첫글자 대문자) () {

}

제가 찾아본 결과는 이러한데 혹시나 틀린 부분이 있다면 수정 부탁드립니다.

일단은 위에 작성된 코드대로 진행하니 정상적으로 출력되었습니다. \

근데 Setter 부분은 적용을 어떻게 할지 몰라서 Getter만 구현했습니다.

살짝 제 생각인데 이미 컬랙션 필드에 저자을 했는데 set도 사용을해야 하나요?

조언 가능하신분들은 조언 부탁드립니다.

일단 아까와 동일하게 이번엔 가정 먼저 입력된 값을 삭제 할 수 있는 기능을 구현해보겠습니다.

먼저 Calculator 클래스에서 다음과 같이 메서드를 생성합니다.

public void removeAnswer() {
        doubleList.remove(0);

해당 메서드를 입력하면 doubleList.remove(0); 코드가 실행됩니다.

App클래스에서 한번 보면 keepGoing에 텍스트가 입력되면 입력된 값에 따라서

while 문이 반복될지 중지될지 확인 할 수 있습니다.

			public static void main(String[] args) {
       
     			  Calculator calc = new Calculator();
      			  Scanner sc = new Scanner(System.in);
                 ArrayList<Double> setcheck = calc.getDoubleList();


       boolean flag = true;
       while (flag) {
           
           
           String keepGoing = sc.next();
          
          if (keepGoing.equals("yes")) {
               flag = true;
           } else if (keepGoing.equals("exit")) {
               flag = false;
           } else if (keepGoing.equals("remove")) {
               calc.removeAnswer();
           } 
```		}
	}
   

if 문에 else if 를 추가해서 "remove" 가 입력되면

setcheck에 ArrayList에서

1번째 값이 삭제 됩니다.

물론 index 이기 때문에 입력은 0으로 해줍니다.

해당 코드도 한번 실행해 보겠습니다.

첫 번째 숫자를 입력하세요: 
1
두 번째 숫자를 입력하세요: 
1
사칙연산 기호를 입력하세요: 
+
결과 : 2.0

더 계산하시겠습니까? (exit  입력 시 종료)
가장 먼저 저장된 데이터를 삭제하시겠습니까? (remove 입력 시 삭제)

저장 목록 확인 : [2.0]

d
첫 번째 숫자를 입력하세요: 
3
두 번째 숫자를 입력하세요: 
5
사칙연산 기호를 입력하세요: 
+
결과 : 8.0

더 계산하시겠습니까? (exit  입력 시 종료)
가장 먼저 저장된 데이터를 삭제하시겠습니까? (remove 입력 시 삭제)

저장 목록 확인 : [2.0, 8.0]
d
첫 번째 숫자를 입력하세요: 
10
두 번째 숫자를 입력하세요: 
5
사칙연산 기호를 입력하세요: 
/
결과 : 2.0

더 계산하시겠습니까? (exit  입력 시 종료)
가장 먼저 저장된 데이터를 삭제하시겠습니까? (remove 입력 시 삭제)

저장 목록 확인 : [2.0, 8.0, 2.0]
remove
첫 번째 숫자를 입력하세요: 
3
두 번째 숫자를 입력하세요: 
3
사칙연산 기호를 입력하세요: 
*
결과 : 9.0

더 계산하시겠습니까? (exit  입력 시 종료)
가장 먼저 저장된 데이터를 삭제하시겠습니까? (remove 입력 시 삭제)

저장 목록 확인 : [8.0, 2.0, 9.0]

보시는 것과 같이 [2.0] => [2.0, 8.0] => [2.0, 8.0, 2.0] => [8.0, 2.0, 9.0]

하나씩 입력이 추가 되고 3번째에서 remove를 입력했을때 가장 먼저 저장된 값인 2.0 이 삭제되신 것을 확인 할 수 있습니다.

트러블 슈팅 : 이 부분은 위에 Getter를 하고 진행하니 오히려 수월한 부분이였습니다.

다만 아쉬운건 특정 텍스트를 입력했을때만 while문이 진행됐으면 좋았는데

if (keepGoing.equals("yes")) {
flag = true;
}
이렇게 만들지 않아도 아무키나 입력해도 while문 이 진행되는 것이 아쉬웠습니다.

가장 어려웠던 부분은 다른 클래스에 연산을 수행하게 하는 것과 Getter 부분이였습니다.

다른 클래스에 연산을 기존 클래스에서 어떻게 참조하는지가 처음에 막막 했습니다.

혹시 제가 잘못 입력했거나 수정해야 할 부분이 있다면 알려주시면 감사하겠습니다!

profile
평범한 개발자

0개의 댓글