Java/기타

계산기 만들기

열심히 해 2024. 9. 6. 21:10

24/09/12 수정

 

Lv1. 새로운 클래스 생성 없이 계산기 만들기

 

더보기
package calculator;

import java.util.Scanner;

public class Lv1 {
    public static void main(String[] args) {
        boolean exitKey = true;

        do {
            int number;
            System.out.println("첫 번째 숫자를 입력하세요: ");
            Scanner int1 = new Scanner(System.in);
            int int1Number = int1.nextInt();



            System.out.println("사칙연산 기호를 입력하세요: ");
            Scanner calculate = new Scanner(System.in);
            String symbol = calculate.next();

            System.out.println("두 번째 숫자를 입력하세요: ");
            Scanner int2 = new Scanner(System.in);
            int int2Number = int2.nextInt();

            switch (symbol){
                case "+" :
                    number = int1Number + int2Number;
                    System.out.println("계산 결과 : " + number);

                    System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
                    Scanner exit1 = new Scanner(System.in);
                    String exitText1 = exit1.next();

                    if("exit".equals(exitText1)){
                        exitKey = false;
                    }
                    else {
                        exitKey = true;
                    }
                    break;

                case "-" :
                    number = int1Number - int2Number;
                    System.out.println("계산 결과 : " + number);

                    System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
                    Scanner exit2 = new Scanner(System.in);
                    String exitText2 = exit2.next();
                    if("exit".equals(exitText2)){
                        exitKey=false;
                    }
                    else {
                        exitKey = true;
                    }
                    break;

                case "*" :
                    number = int1Number * int2Number;
                    System.out.println("계산 결과 : " + number);

                    System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
                    Scanner exit3 = new Scanner(System.in);
                    String exitText3 = exit3.next();
                    if("exit".equals(exitText3)){
                        exitKey=false;
                    }
                    else {
                        exitKey=true;
                    }
                    break;

                case "/" :
                    if (int2Number==0){
                        System.out.println("0으로 나누기를 할 수 없습니다");
                        break;
                    }
                    else {
                        double Anserumber = int1Number / int2Number;
                        System.out.println("계산 결과 : " + Anserumber);

                        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
                        Scanner exit4 = new Scanner(System.in);
                        String exitText4 = exit4.next();
                        if("exit".equals(exitText4)){
                            exitKey=false;
                        }
                        else {
                            exitKey=true;
                        }
                    }
                    break;

            default : System.out.println("숫자와 사칙연산 기호를 확인하세요");
            }
        } while(exitKey);
    }
}

1. case 문 사용시 

 

`case (조건)` 이렇게 적었는데 ()괄호 없이 `case 조건` 이렇게 적는 것이 옳다.

 

2. if 문에서 텍스트를 확인할 때 

exitKey == "exit"로 적었는데 String은 참조형 변수-주소값을 저장하기 때문에 등호로 비교할 수 없다. 따라서 equals()라는 메서드를 사용해야 한다. `비교군1.equals(비교군2)`

 

3. do 위에 변수들을 선언했는데, 이러면 다시 계산을 시작할 때 입력하지 못하게 된다. 변수들의 위치도 중요하다.

 

 

 

 

Lv2. 새로운 클래스를 생성하여 계산기 만들기

 

메인 클래스

더보기
package calculator.CalculatorLv2;

import java.util.Scanner;

public class Lv2 {
    public static void main(String[] args) {
        int number=0;
        boolean exitKey = true;

        do {
            System.out.println("첫 번째 숫자를 입력하세요: ");
            Scanner number1 = new Scanner(System.in);
            int firNumber = number1.nextInt();

            System.out.println("사칙연산 기호를 입력하세요: ");
            Scanner operator = new Scanner(System.in);
            String getOperator = operator.next();

            System.out.println("두 번째 숫자를 입력하세요: ");
            Scanner number2 = new Scanner(System.in);
            int secNumber = number2.nextInt();

            switch (getOperator){
                case "+" :
                    number = Calculator.addCalculate(firNumber, secNumber);
                    System.out.println(number);

                    exitKey = Calculator.exitCalculator();

                    break;

                case "-" :
                    number = Calculator.substractCalculate (firNumber, secNumber);
                    System.out.println(number);

                    exitKey = Calculator.exitCalculator();

                    break;

                case "*" :
                    number = Calculator.multiplyCalculate(firNumber, secNumber);
                    System.out.println(number);

                    exitKey = Calculator.exitCalculator();

                    break;

                case "/" :
                    if (secNumber==0){
                        System.out.println("0으로 나누기를 할 수 없습니다");
                        break;
                    }
                    else {
                        number = Calculator.divideCalculate(firNumber, secNumber);
                        System.out.println(number);

                        exitKey = Calculator.exitCalculator();
                    }
                    break;

                default : System.out.println("숫자와 사칙연산 기호를 확인하세요");
            }
        } while(exitKey);


        System.out.println("계산 결과를 수정하고 싶으면 set을 입력하시오");
        System.out.println("가장 먼저 계산된 결과값을 삭제하고 싶으면 remove를 입력하시오");
        System.out.println("계산기를 종료하고 싶으면 esc를 입력하시오");
        Scanner Key = new Scanner(System.in);
        String inputKey = Key.next();

        switch (inputKey) {
            case "set" -> {
                System.out.println(Calculator.getResultsList());
                System.out.println("수정하고 싶은 결과의 순번과 값을 차례대로 입력하시오.");
                System.out.println("수정하고 싶은 결과의 순번을 입력하시오: ");
                Scanner setIndex = new Scanner(System.in);
                int setIndexKey = (setIndex.nextInt() - 1);

                System.out.println("수정하고 싶은 결과의 값을 입력하시오: ");
                Scanner setValue = new Scanner(System.in);
                int setValueKey = setValue.nextInt();

                Calculator.setResultsList(setIndexKey, setValueKey);
            }
            case "remove" -> Calculator.removeFirstResult();
            case "esc" -> {
            }
            default -> {
                System.out.println("set, get, remove 중 하나를 입력하시오");
            }
        }
    }
}

 

계산 수행 클래스 

 

더보기
package calculator.CalculatorLv2;

import java.util.ArrayList;
import java.util.Scanner;


public class Calculator {
    private final static ArrayList<Integer> resultsList = new ArrayList<>();
    static int number;
    static boolean exitKey;

    static int addCalculate (int firstNumber, int secondNumber) {
        number = firstNumber + secondNumber;
        resultsList.add(number);
        return number;

    }

    static int substractCalculate (int firstNumber, int secondNumber) {
        number = firstNumber - secondNumber;
        resultsList.add(number);
        return number;
    }
    static int multiplyCalculate (int firstNumber, int secondNumber) {
        number = firstNumber * secondNumber;
        resultsList.add(number);
        return number;
    }
    static int divideCalculate (int firstNumber, int secondNumber) {
        number = firstNumber / secondNumber;
        resultsList.add(number);
        return number;
    }

    static ArrayList<Integer> getResultsList () {
        return resultsList;
    }

    static ArrayList<Integer> setResultsList (int countNumber, int value) {
        resultsList.set(countNumber , value);
        System.out.println(resultsList);
        return resultsList;
    }

    static ArrayList<Integer> removeFirstResult () {
        resultsList.remove(resultsList.getFirst());
        System.out.println(resultsList);
        return resultsList;
    }

    static boolean exitCalculator () {
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
        Scanner inputExit = new Scanner(System.in);
        String exitText = inputExit.next();
        if ("exit".equals(exitText)){
            exitKey=false;
        }
        else {
            exitKey=true;
        }
        return exitKey;
    }
}

 

0. lv 2를 할 때는 Java문법 종합반 3주차 과제를 끝내고 해서 그런지 생각보다 수월했다.

 

1. 계산 수행 클래스의 7번 째 줄. 왜 final과 static이 들어가는가 ? 처음에는 final을 쓰지도 않았다. 또 static을 사용하지 않고 메인 클래스에 객체를 생성하여 함수를 호출했었다.

 

 

 

final에 대하여

 

final 변수를 사용하면 이후 코드에서 이 값을 변경하는 것을 방지할 수 있습니다.

 

final 메소드는 하위 클래스에서 오버라이딩을 금지합니다. 이는 부모 클래스의 특정 동작을 변경하지 못하게 하여, 코드의 예측 가능성을 높이고, 설계의 의도를 명확하게 전달하는 데 도움을 줍니다.

 

final 클래스는 상속을 금지합니다. 이는 클래스의 확장을 방지하고, 불변성을 유지하며, 보안과 성능을 향상시키는 데 기여할 수 있습니다. 예를 들어, 자바의 String 클래스는 final로 선언되어 있어, 이를 상속하거나 변경할 수 없습니다.

 

?? 변경 불가능하면 ArrayList의 삭제 및 추가 등도 못하는 거 아닌가??

 

->> List 내부에 있는 값들은 변경이 가능하다. 왜 ??

 

->> 내부 값을 못 바꾸는 찐 변경 금지 하는 방법 : Unmodifiable List를 이용 .

 

    public List<String> makeUnmodifiable() {
        Collections.unmodifiableList(new ArrayList<Integer>(resultsList));
    }

 

 

 

 

  static에 대하여

 

static 키워드는 클래스 레벨에서 사용되며, 이를 통해 메모리 할당과 관리의 효율성을 높일 수 있습니다. 클래스가 로드될 때 단 한 번만 메모리에 할당되고, 이후 생성되는 모든 인스턴스에서 공유됩니다. 이는 특히 상수값이나 공유해야 할 자원을 관리할 때 유용합니다.

 

예를 들어, 데이터베이스 연결 인스턴스나 공유 설정 값 등을 static 변수로 선언하면, 모든 인스턴스에서 이를 공유할 수 있어 메모리 사용을 최적화하고, 접근성을 높일 수 있습니다. static 변수는 클래스 레벨에서 선언되며, 모든 인스턴스에 의해 공유됩니다. 이는 특정 데이터를 모든 인스턴스가 공유해야 할 때 유용합니다. 

 

public class Car {
    public final static String company = "KIA";
}
// 클래스 Car를 통해 만들어지는 모든 객체의 company는 KIA

 

하지만 static 변수는 사이드 이펙트를 유발할 수 있습니다. 왜냐하면 모든 인스턴스에서 공유되기 때문에, 하나의 인스턴스에서 static 변수의 값을 변경하면, 모든 인스턴스에 영향을 미치기 때문입니다. 따라서 static 변수의 사용은 신중하게 고려되어야 합니다.

 

 

 

   static 메소드는 인스턴스 생성 없이 클래스 이름을 통해 직접 호출할 수 있습니다. 이는 static 메소드가 클래스 레벨에서 작동하기 때문입니다. static 메소드는 인스턴스의 상태에 의존하지 않는 연산을 수행할 때 유용합니다. 메소드 호출 시 인스턴스 생성의 오버헤드 없이 빠른 실행이 가능합니다.

 

public class AddOperator {
    public static int addOperate(int a, int b) {
        return a + b;
    }
}

// 이렇게 해두면 클래스 AddOperator의 객체를 만들지 않고도 메서드를 활용할 수 있다.
// 즉 생성한객체이름.addOperate(3,7) 하지 않고도 addOperate.addOperate(3,7)을 사용할 수 있다

 

하지만, static 메소드는 인스턴스 변수에 접근할 수 없으며, 클래스의 다른 static 메소드나 변수만 접근할 수 있다. 따라서 인스턴스 멤버에 접근해야 하는 경우에는 사용할 수 없습니다. 따라서 사용 시에는 이러한 제한을 고려해야 합니다.

 

 

2. getter 와 setter 를 사용할 때는 private과 같은 접근 제어자의 활용이 필수적이다. 이를 통해 감추고 싶은 데이터는 다른 Class에 저장하고 관리할 수 있다. 

 

'Java > 기타' 카테고리의 다른 글

숫자 야구 게임 Lv 4  (14) 2024.09.22
숫자 야구 게임 Lv3  (0) 2024.09.14
숫자 야구 게임 Lv2  (1) 2024.09.13
숫자 야구 게임 Lv1  (1) 2024.09.12
1, 2주차 과제 다시 하기.  (4) 2024.09.07