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


