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

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

1日目のゴールと全体像

1日目のテーマは 「Javaで電卓アプリを作るための“土台となる考え方”をつかむこと」 です。

この7日間で目指すのは、コンソールベースでも構わないので 「四則演算ができて、履歴も扱える電卓アプリ」 を Javaのオブジェクト指向を使って作り切ることです。

1日目では、まだ完成形は目指しません。 代わりに、次の5つを 電卓という具体的なイメージと結びつけて理解すること をゴールにします。

  • Java文法:変数・if・メソッドのイメージ
  • クラス:電卓そのものを「クラス」として考える
  • メソッド:意味のある処理のかたまりとして設計する
  • コレクション:計算履歴を「リスト」として扱うイメージ
  • ファイル操作:履歴をファイルに保存するイメージ

ここでは、すべてを完璧に書けなくて大丈夫です。 「電卓アプリの中に、これら5つがどう入り込むのか」を、 ストーリーとしてつかむことを大事にしていきます。

Java文法:電卓の“入力・計算・出力”をコードで表す

変数と演算の基本イメージ

電卓アプリの最もシンプルな形は、 「2つの数字と1つの演算子を受け取って、結果を表示する」 というものです。

Javaでは、こんなコードになります。

public class SimpleCalculator {
    public static void main(String[] args) {
        // 2つの整数と演算子を用意する
        int a = 10;          // 1つ目の数字
        int b = 5;           // 2つ目の数字
        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;  // 割り算
        }

        // 結果をコンソールに表示する
        System.out.println("結果: " + a + " " + op + " " + b + " = " + result);
    }
}
Java

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

  • intchar といった を使って変数を宣言していること
  • if / else if条件分岐 をしていること
  • System.out.println出力 をしていること

電卓は「入力 → 計算 → 出力」という流れがはっきりしているので、 Java文法を学ぶ題材としてとても分かりやすいです。

メソッドとしてまとめるイメージ

同じ処理を何度も使いたくなったら、 メソッド にまとめるとスッキリします。

public class SimpleCalculator {

    // 計算を行うメソッド
    // a: 左の数字, b: 右の数字, op: 演算子
    public static 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;
        }

        return result; // 計算結果を呼び出し元に返す
    }

    public static void main(String[] args) {
        int r = calculate(10, 5, '+'); // メソッドを呼び出して計算
        System.out.println("結果: " + r);
    }
}
Java

ここで深掘りしたいのは、 「メソッドは“意味のある処理のかたまり”」 だということです。

電卓では「計算する」という意味のかたまりを calculate というメソッドにしておくと、 後からコードを読む人にも意図が伝わりやすくなります。

クラス:電卓そのものを“ひとつのオブジェクト”として考える

電卓クラスのイメージ

Javaはオブジェクト指向言語なので、 電卓そのものを クラス として表現できます。

「電卓クラス」は、ざっくり言うと次のような役割を持ちます。

  • 計算を行うメソッドを持つ
  • 将来的に「履歴」や「メモリ機能」を追加できる

まずは、シンプルな電卓クラスのイメージを見てみましょう。

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

    // 計算を行うインスタンスメソッド
    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;
        }

        return result;
    }
}
Java

使う側はこうなります。

public class CalculatorApp {
    public static void main(String[] args) {
        // 電卓クラスのインスタンスを作る
        Calculator calc = new Calculator();

        // 電卓に計算をしてもらう
        int result = calc.calculate(10, 5, '+');

        System.out.println("結果: " + result);
    }
}
Java

ここで重要なのは、 「Calculator というクラスが“電卓という概念”を表している」 ということです。

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

現実世界の「電卓」を、 コードの世界の「クラス」に対応させるのがオブジェクト指向の基本的な考え方です。

メソッド:電卓の操作を“意味ごとに分ける”

電卓の操作をメソッドに分けるイメージ

電卓アプリを少し育てると、 「入力」「計算」「表示」を分けたくなります。

例えば、次のようなメソッド構成が考えられます。

  • readNumber():数字を入力する
  • readOperator():演算子を入力する
  • calculate():計算する
  • printResult():結果を表示する

簡単なテンプレートを見てみましょう。

import java.util.Scanner;

public class ConsoleCalculator {

    // ユーザーから整数を入力してもらうメソッド
    public static int readNumber(Scanner scanner, String message) {
        System.out.print(message);
        int value = scanner.nextInt(); // 整数を読み取る
        return value;
    }

    // ユーザーから演算子を入力してもらうメソッド
    public static char readOperator(Scanner scanner, String message) {
        System.out.print(message);
        String input = scanner.next(); // 文字列を読み取る
        return input.charAt(0);        // 先頭の1文字を演算子として使う
    }

    // 計算を行うメソッド(先ほどの calculate と同じ役割)
    public static 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;
        }

        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // コンソール入力用

        int a = readNumber(scanner, "1つ目の数字を入力してください: ");
        int b = readNumber(scanner, "2つ目の数字を入力してください: ");
        char op = readOperator(scanner, "演算子を入力してください (+, -, *, /): ");

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

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

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

ここで深掘りしたいのは、 「メソッド名が“何をしているか”を説明してくれるようにする」 ということです。

コードを読んだときに、 「何が起きているか」が自然に頭に入ってくるようになります。

コレクション:計算履歴を“リスト”として扱う

計算履歴を List で持つイメージ

電卓アプリを少しだけ育てると、 「過去の計算履歴を残したい」という欲が出てきます。

例えば、

  • 10 + 5 = 15
  • 3 * 4 = 12
  • 100 - 30 = 70

といった履歴を、後から見返せるようにしたいわけです。

Javaでは、こうした「複数のデータ」を扱うときに コレクション(特に List を使います。

まず、履歴を表すクラスを作ります。

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

    // 履歴を文字列として表示するためのメソッド
    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;
        }

        // 履歴オブジェクトを作成してリストに追加
        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

ここで深掘りしたいのは、 「List は“増えていくデータの箱”」 だということです。

電卓では、計算するたびに履歴が増えていきます。 それを List<CalculationHistory> として持っておくことで、 後から「全部表示する」「条件で絞る」といったことができるようになります。

ファイル操作:履歴を“電卓の記憶”として保存する

履歴をテキストファイルに書き出すイメージ

電卓アプリをさらに育てると、 「アプリを終了しても履歴を残しておきたい」 という欲が出てきます。

そこで登場するのが ファイル操作 です。

Javaでは、java.io パッケージのクラスを使って ファイルに書き込んだり、読み込んだりできます。

履歴をテキストファイルに保存する例を見てみましょう。

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

ここで深掘りしたいのは、 「ファイルは“電卓の記憶”」 だということです。

  • List → アプリ起動中の記憶
  • ファイル → アプリ終了後も残る記憶

電卓の履歴をファイルに保存しておけば、 次回起動時に読み込んで、 「前回までの履歴」を再現することもできます。

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

1日目は、まだ完成した電卓を作る日ではありません。 代わりに、次の5つを 電卓という具体的なイメージと結びつけて理解する日 です。

  • Java文法:変数・if・メソッドで「入力 → 計算 → 出力」を表現できる。
  • クラスCalculator クラスとして「電卓というモノ」をコードで表現できる。
  • メソッドcalculatereadNumber のように「意味のある処理のかたまり」を作れる。
  • コレクションList<CalculationHistory> として「増えていく履歴」を扱えるイメージを持つ。
  • ファイル操作:履歴をファイルに保存することで「電卓の記憶」を残せるイメージを持つ。

この1日目のイメージがあると、 2日目以降で「実際に電卓クラスを作り、履歴やファイル保存を実装していく」ときに、 「何をどこに書けばいいか」 が迷いにくくなります。

電卓という小さなアプリの中に、 Javaの基礎——文法・クラス・メソッド・コレクション・ファイル操作——がぎゅっと詰まっています。 ここから少しずつ、実際のコードを肉付けしていきましょう。

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