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ここで押さえたいポイントは、
intやcharといった 型 を使って変数を宣言していること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 = 153 * 4 = 12100 - 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クラスとして「電卓というモノ」をコードで表現できる。 - メソッド:
calculateやreadNumberのように「意味のある処理のかたまり」を作れる。 - コレクション:
List<CalculationHistory>として「増えていく履歴」を扱えるイメージを持つ。 - ファイル操作:履歴をファイルに保存することで「電卓の記憶」を残せるイメージを持つ。
この1日目のイメージがあると、 2日目以降で「実際に電卓クラスを作り、履歴やファイル保存を実装していく」ときに、 「何をどこに書けばいいか」 が迷いにくくなります。
電卓という小さなアプリの中に、 Javaの基礎——文法・クラス・メソッド・コレクション・ファイル操作——がぎゅっと詰まっています。 ここから少しずつ、実際のコードを肉付けしていきましょう。


