Java | 1 日 60 分 × 7 日アプリ学習:Java基礎・オブジェクト指向 電卓編

Web APP Java
スポンサーリンク
スポンサーリンク

2日目のゴールと全体像

2日目のテーマは 「Javaで“動くコンソール電卓”を実際に書いてみること」 です。

1日目では、電卓アプリの中に

  • Java文法(変数・if・メソッド)
  • クラス(Calculator
  • メソッド(calculate
  • コレクション(履歴用 List
  • ファイル操作(履歴保存のイメージ)

がどう入りそうかを、ざっくりイメージしました。

2日目では、そのイメージを コンソール電卓として実際のコードにしていく ことを目標にします。

  • ユーザーから入力を受け取る
  • Calculator クラスで計算する
  • 計算履歴を List にため始める
  • 履歴を表示する
  • ファイル保存の“入口”を作る

「完璧な電卓」ではなく、 「動く電卓の最初の形」 を作る日だと思って読んでみてください。

Java文法:コンソール電卓の“入力 → 計算 → 出力”を作る

Scannerでユーザー入力を受け取る

まずは、コンソールで動くシンプルな電卓を書いてみます。 ユーザーから数字と演算子を入力してもらい、結果を表示します。

import java.util.Scanner;

public class ConsoleCalculatorApp {

    public static void main(String[] args) {
        // コンソール入力を扱うためのScanner
        Scanner scanner = new Scanner(System.in);

        // 1つ目の数字を入力してもらう
        System.out.print("1つ目の数字を入力してください: ");
        int a = scanner.nextInt(); // 整数として読み取る

        // 2つ目の数字を入力してもらう
        System.out.print("2つ目の数字を入力してください: ");
        int b = scanner.nextInt();

        // 演算子を入力してもらう
        System.out.print("演算子を入力してください (+, -, *, /): ");
        String opInput = scanner.next(); // 文字列として読み取る
        char op = opInput.charAt(0);     // 先頭の1文字を演算子として使う

        // 計算結果を入れる変数
        int result = 0;

        // 演算子に応じて処理を分ける
        if (op == '+') {
            result = a + b;
        } else if (op == '-') {
            result = a - b;
        } else if (op == '*') {
            result = a * b;
        } else if (op == '/') {
            result = a / b;
        } else {
            System.out.println("対応していない演算子です。");
        }

        // 結果を表示する
        System.out.println("結果: " + a + " " + op + " " + b + " = " + result);

        // Scannerを閉じる
        scanner.close();
    }
}
Java

ここで押さえたいポイントは、

  • Scanner でコンソール入力を扱っていること
  • nextInt()next()数字と文字列を読み分けている こと
  • if / else if で演算子ごとに処理を分けていること

この時点で、すでに「動く電卓」の最小形ができています。

クラスとメソッド:Calculator クラスにロジックを閉じ込める

電卓クラスを作る

2日目では、計算ロジックをクラスにまとめていきます。 「電卓そのもの」を Calculator クラスとして表現します。

// 電卓を表すクラス
public class Calculator {

    // 計算を行うメソッド
    // a: 左の数字, b: 右の数字, op: 演算子
    public int calculate(int a, int b, char op) {
        int result = 0;

        if (op == '+') {
            result = a + b;
        } else if (op == '-') {
            result = a - b;
        } else if (op == '*') {
            result = a * b;
        } else if (op == '/') {
            result = a / b;
        } else {
            // 対応していない演算子の場合は0を返す(本当は例外なども検討できる)
            System.out.println("対応していない演算子です: " + op);
        }

        return result;
    }
}
Java

この Calculator を使う側はこうなります。

import java.util.Scanner;

public class ConsoleCalculatorApp {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 電卓クラスのインスタンスを作る
        Calculator calc = new Calculator();

        System.out.print("1つ目の数字を入力してください: ");
        int a = scanner.nextInt();

        System.out.print("2つ目の数字を入力してください: ");
        int b = scanner.nextInt();

        System.out.print("演算子を入力してください (+, -, *, /): ");
        String opInput = scanner.next();
        char op = opInput.charAt(0);

        // 電卓に計算をしてもらう
        int result = calc.calculate(a, b, op);

        System.out.println("結果: " + a + " " + op + " " + b + " = " + result);

        scanner.close();
    }
}
Java

ここで深掘りしたいのは、 「Calculator クラスは“電卓というモノ”をコードの中に持つための器」 だということです。

  • calculate メソッド → 電卓の「計算する」機能
  • Calculator クラス → 電卓という「概念」

この対応関係が、オブジェクト指向の入り口になります。

コレクション:計算履歴を List にため始める

履歴クラスと履歴リストを作る

電卓が1回動くだけではもったいないので、 計算履歴を残してみます。

まず、1回分の履歴を表すクラスを作ります。

// 1回分の計算履歴を表すクラス
public class CalculationHistory {
    public int left;      // 左の数字
    public int right;     // 右の数字
    public char operator; // 演算子
    public int result;    // 結果

    // 履歴を文字列として表示するためのメソッド
    @Override
    public String toString() {
        return left + " " + operator + " " + right + " = " + result;
    }
}
Java

次に、電卓クラスに履歴リストを持たせます。

import java.util.ArrayList;
import java.util.List;

// 履歴付き電卓クラス
public class HistoryCalculator {

    // 計算履歴を保存するリスト
    private List<CalculationHistory> histories = new ArrayList<>();

    // 計算を行い、履歴も保存するメソッド
    public int calculate(int a, int b, char op) {
        int result = 0;

        if (op == '+') {
            result = a + b;
        } else if (op == '-') {
            result = a - b;
        } else if (op == '*') {
            result = a * b;
        } else if (op == '/') {
            result = a / b;
        } else {
            System.out.println("対応していない演算子です: " + op);
        }

        // 履歴オブジェクトを作成してリストに追加
        CalculationHistory history = new CalculationHistory();
        history.left = a;
        history.right = b;
        history.operator = op;
        history.result = result;

        histories.add(history); // 履歴リストに追加

        return result;
    }

    // 全ての履歴を取得するメソッド
    public List<CalculationHistory> getHistories() {
        return histories;
    }
}
Java

使う側はこうなります。

import java.util.List;
import java.util.Scanner;

public class HistoryCalculatorApp {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 履歴付き電卓のインスタンス
        HistoryCalculator calc = new HistoryCalculator();

        // とりあえず3回分の計算をしてみる
        for (int i = 0; i < 3; i++) {
            System.out.print("1つ目の数字を入力してください: ");
            int a = scanner.nextInt();

            System.out.print("2つ目の数字を入力してください: ");
            int b = scanner.nextInt();

            System.out.print("演算子を入力してください (+, -, *, /): ");
            String opInput = scanner.next();
            char op = opInput.charAt(0);

            int result = calc.calculate(a, b, op);

            System.out.println("結果: " + a + " " + op + " " + b + " = " + result);
            System.out.println();
        }

        // 全履歴を表示する
        List<CalculationHistory> histories = calc.getHistories();

        System.out.println("=== 計算履歴 ===");
        for (CalculationHistory h : histories) {
            System.out.println(h); // toString() が呼ばれる
        }

        scanner.close();
    }
}
Java

ここで深掘りしたいのは、 「List は“増えていくものを入れておく箱”」 だということです。

電卓では、計算するたびに履歴が増えていきます。 それを List<CalculationHistory> に入れておくことで、 後からまとめて扱えるようになります。

ファイル操作:履歴を保存する“入口”を作る

とりあえずテキストファイルに書き出してみる

2日目では、 「履歴をファイルに保存する」という行為を 一度体験しておくことを目標にします。

import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

// 履歴をファイルに保存するユーティリティクラス
public class HistoryFileSaver {

    // 履歴リストを指定されたファイルパスに保存するメソッド
    public static void save(List<CalculationHistory> histories, String filePath) {
        FileWriter writer = null;

        try {
            // ファイルを書き込みモードで開く
            writer = new FileWriter(filePath);

            // 各履歴を1行ずつ書き込む
            for (CalculationHistory h : histories) {
                // CSV形式: left,operator,right,result
                String line = h.left + "," + h.operator + "," + h.right + "," + h.result;
                writer.write(line + System.lineSeparator());
            }

            System.out.println("履歴を " + filePath + " に保存しました。");

        } catch (IOException e) {
            // ファイル操作中にエラーが発生した場合
            System.out.println("履歴の保存中にエラーが発生しました: " + e.getMessage());
        } finally {
            // ファイルを閉じる(nullチェックも忘れずに)
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    System.out.println("ファイルを閉じる際にエラーが発生しました: " + e.getMessage());
                }
            }
        }
    }
}
Java

これを HistoryCalculatorApp から呼び出してみます。

// 履歴をファイルに保存する例
List<CalculationHistory> histories = calc.getHistories();
HistoryFileSaver.save(histories, "history.txt");
Java

ここで深掘りしたいのは、 「ファイルに書き出すことで、電卓に“記憶”が生まれる」 ということです。

アプリを終了しても、 history.txt を見れば、 自分がどんな計算をしてきたかを振り返ることができます。

2日目で本当に掴んでほしいこと

2日目は、 「電卓の最初の動く形をJavaで作る日」 です。

  • Scanner でユーザー入力を受け取り、if 文で計算する
  • Calculator クラスを作り、計算ロジックを中に閉じ込める
  • List<CalculationHistory> で履歴を持ち始める
  • 履歴をコンソールに表示して「過去の計算」を見られるようにする
  • ファイルに履歴を書き出して「電卓の記憶」を作り始める

この段階で、すでに 「Javaでひとつのアプリを動かした」 という経験が手に入っています。

3日目以降は、この電卓を少しずつ育てながら、 オブジェクト指向らしい設計や、 より実用的な機能へと進めていくことになります。

タイトルとURLをコピーしました