Java | 1 日 120 分 × 7 日アプリ学習:初級編

Java
スポンサーリンク

この初級編7日間プランの全体像

この「1 日 120 分 × 7 日・初級編」は、あなたがすでに

  • main メソッド
  • 変数・if・for
  • メソッド
  • 配列

など「超初級」で触った前提で、そこから一段階レベルを上げるためのコースです。

目標は「1 ファイルに全部書く人」から卒業して、

  • 自分でクラスを定義できるようになる
  • オブジェクト指向の入口に立つ
  • コレクション(ArrayList)で柔軟にデータを扱える
  • 小さなコンソールアプリを「設計して」作れる

ところまで行くことです。

1 日 120 分は、前半 60 分で読んで理解、後半 60 分で「自分の手で書いて動かす」イメージで進めてください。


1 日目:Scanner で入力を受け取る「対話型プログラム」の基礎

コンソール入力の基本(Scanner)

超初級では、値をコードの中に直接書き込んでいました。
初級では「ユーザーが入力した値を使う」プログラムに進みます。
そのために使うのが java.util.Scanner クラスです。

次のコードを書いて、数字を入力してみてください。

import java.util.Scanner;

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

        System.out.print("あなたの名前を入力してください: ");
        String name = scanner.nextLine();

        System.out.print("あなたの年齢を入力してください: ");
        int age = scanner.nextInt();

        System.out.println("こんにちは、" + name + "さん(" + age + "歳)");
    }
}
Java

ここで重要なポイントを深掘りします。

1.import java.util.Scanner;
Scanner クラスを使うには、この一行が必要です。
java.util というパッケージの中に Scanner がある、という意味です。

2.Scanner scanner = new Scanner(System.in);
new は「新しいオブジェクトを作る」キーワードです。
System.in は「キーボード入力」を表す特別なオブジェクト。
それを受け取って、scanner という名前の「入力の道具」を作っています。

3.nextLine()nextInt()
nextLine() は 1 行分の文字列を読む。
nextInt() は整数を読む。
型が違うので、用途によって使い分けます。

入力と if・計算を組み合わせる

簡単な「BMI もどき」として、身長と体重から「軽め〜重め」を判断する例です。

import java.util.Scanner;

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

        System.out.print("身長(cm) を入力してください: ");
        double heightCm = scanner.nextDouble();

        System.out.print("体重(kg) を入力してください: ");
        double weight = scanner.nextDouble();

        double heightM = heightCm / 100.0;
        double bmi = weight / (heightM * heightM);

        System.out.println("あなたのBMIは " + bmi + " です。");

        if (bmi < 18.5) {
            System.out.println("少しやせ気味かもしれません。");
        } else if (bmi < 25) {
            System.out.println("標準的な範囲です。");
        } else {
            System.out.println("少し重めかもしれません。");
        }
    }
}
Java

ここでは Scanner と if、数値計算をセットで使っています。
「入力 → 計算 → 条件分岐 → 結果表示」の流れを意識してください。


2 日目:メソッドをもう一段深く(オーバーロードと分割)

メソッドで「まとまり」をはっきりさせる

昨日の BMI プログラムは、全部 main に書いても動きますが、
読みやすく・変更しやすくするために、処理をメソッドに分けていきます。

次のように分割してみましょう。

import java.util.Scanner;

public class Main {

    public static double calculateBmi(double heightCm, double weight) {
        double heightM = heightCm / 100.0;
        return weight / (heightM * heightM);
    }

    public static String judgeBmi(double bmi) {
        if (bmi < 18.5) {
            return "少しやせ気味かもしれません。";
        } else if (bmi < 25) {
            return "標準的な範囲です。";
        } else {
            return "少し重めかもしれません。";
        }
    }

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

        System.out.print("身長(cm): ");
        double height = scanner.nextDouble();

        System.out.print("体重(kg): ");
        double weight = scanner.nextDouble();

        double bmi = calculateBmi(height, weight);
        String message = judgeBmi(bmi);

        System.out.println("BMI: " + bmi);
        System.out.println(message);
    }
}
Java

重要なポイントを整理します。

1.calculateBmi は「BMI を計算するだけ」
2.judgeBmi は「BMI からメッセージを返すだけ」
3.main は「入力 → 計算 → 判定 → 表示」という流れの制御だけ

このように、「役割ごとにメソッドを分ける」考え方は、初級のうちに癖にしておくと後がめちゃくちゃ楽です。

メソッドのオーバーロード(同じ名前で引数違い)

メソッド名は同じでも、「引数の数や型」が違えば定義を増やせます。
これがオーバーロードです。

public class Main {

    public static int add(int a, int b) {
        return a + b;
    }

    public static double add(double a, double b) {
        return a + b;
    }

    public static void main(String[] args) {
        int x = add(3, 5);
        double y = add(2.5, 4.3);

        System.out.println(x);
        System.out.println(y);
    }
}
Java

add という同じ名前で、int 用と double 用の 2 つのメソッドが存在します。
呼び出し側の引数の型に応じて、自動で適切なメソッドが選ばれます。

ここで押さえておきたいのは次の点です。

1.「やりたいことは同じだが、型や条件だけ微妙に違う処理」を、一つの名前で扱える
2.名前の意味(ここでは add の「足す」)を中心に考えて、パターンを増やすイメージ


3 日目:クラスとオブジェクトの「入口」

クラスとは何か(設計図のイメージ)

超シンプルに言うと、クラスは「データと、そのデータに関する処理をまとめた設計図」です。

例として、「人」を表すクラスを作ってみます。

public class Person {
    String name;
    int age;

    void greet() {
        System.out.println("こんにちは、" + name + "です。年齢は " + age + " 歳です。");
    }
}
Java

ここには 2 つの要素があります。

1.フィールド(name, age
クラスが持っている「データの項目」です。
オブジェクトごとに中身が変わります。

2.メソッド(greet
そのデータに対して行う「処理」です。
this.name と書かなくても、同じクラス内では名前だけでアクセスできます(基本は同じことだと思って OK)。

オブジェクトを作って使う

この Person クラスを使うための Main クラスを用意します。

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "太郎";
        p1.age = 20;

        Person p2 = new Person();
        p2.name = "花子";
        p2.age = 25;

        p1.greet();
        p2.greet();
    }
}
Java

重要ポイントを深掘りします。

1.Person p1 = new Person();
new で「設計図から実体(オブジェクト)を生成している」。
p1 は「Person 型の変数」で、その中身は「Person オブジェクトへの参照」です。

2.p1.namep1.age で、p1 という人の情報を書き換えている。
3.p1.greet()p2.greet() は、同じメソッド定義を使いつつ、中身のデータが違うので結果も変わる。

「クラス = 設計図」「オブジェクト = 実体」という二段構造をイメージできていれば十分です。


4 日目:コンストラクタと配列・複数オブジェクトの管理

コンストラクタで「作るときに必ず値を入れる」

今の Person は

Person p = new Person();
p.name = "太郎";
p.age = 20;
Java

のように、後から値をセットしています。
「作るときに必ず名前と年齢をもらわないと困る」という場合、コンストラクタを使います。

public class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void greet() {
        System.out.println("こんにちは、" + name + "です。年齢は " + age + " 歳です。");
    }
}
Java

ここでのポイントは 2 つです。

1.コンストラクタの名前はクラス名と同じ(Person)。戻り値の型は書かない。
2.this.name = name;
ここでの this.name は「このオブジェクトのフィールド」。
右側の name は引数。名前がかぶるので、区別するために this. を付けています。

使う側はこうなります。

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("太郎", 20);
        Person p2 = new Person("花子", 25);

        p1.greet();
        p2.greet();
    }
}
Java

これで「作った瞬間から必ず正しい状態にある」オブジェクトになります。
コンストラクタを使うと、「初期化漏れ」が防げるのが大きなメリットです。

Person の配列を扱う

複数人をまとめて管理してみましょう。

public class Main {
    public static void main(String[] args) {
        Person[] people = {
            new Person("太郎", 20),
            new Person("花子", 25),
            new Person("次郎", 18)
        };

        for (int i = 0; i < people.length; i++) {
            people[i].greet();
        }
    }
}
Java

このコードには、初級の「おいしい要素」が詰まっています。

1.配列の中に「オブジェクト」が入っている
2.people[i] で i 番目の Person を取り出し、people[i].greet() でメソッドを呼べる
3.配列の長さを people.length で取って for で回している

「基本型の配列」から「オブジェクトの配列」に感覚を広げるのが、この日のゴールです。


5 日目:ArrayList で「可変長のリスト」を使う

配列の弱点と ArrayList のメリット

配列は

  • サイズが固定(あとから増やせない)
  • 要素を追加・削除するのが面倒

というデメリットがあります。
そこでよく使われるのが ArrayList です。

最初に import が必要です。

import java.util.ArrayList;
Java

基本的な使い方は次のとおりです。

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> todoList = new ArrayList<>();

        todoList.add("牛乳を買う");
        todoList.add("メール返信");
        todoList.add("Javaを勉強");

        System.out.println("件数: " + todoList.size());
        System.out.println("1件目: " + todoList.get(0));

        for (int i = 0; i < todoList.size(); i++) {
            System.out.println((i + 1) + "件目: " + todoList.get(i));
        }
    }
}
Java

重要な点を整理します。

1.ArrayList<String>String の部分は「このリストに入る型」。
ArrayList<Person> など、オブジェクト型も入れられます。

2.new ArrayList<>() で、中身が空のリストを作る。
配列と違い、あとからどんどん add できます。

3.size() で要素数、get(index) で要素取得、remove(index) で削除ができます。

Person のリストを ArrayList で管理する

4 日目の Person を使って、リストにしてみましょう。

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<Person> people = new ArrayList<>();

        people.add(new Person("太郎", 20));
        people.add(new Person("花子", 25));
        people.add(new Person("次郎", 18));

        for (int i = 0; i < people.size(); i++) {
            Person p = people.get(i);
            p.greet();
        }
    }
}
Java

配列から ArrayList に変えただけで、使用感がかなり柔らかくなるはずです。
特に「あとから追加していく」「削除する」場面では、ArrayList の恩恵が大きいです。


6 日目:ミニ「生徒管理」アプリを作る(クラス+ArrayList+Scanner)

アプリの仕様を決める

ここでは、コンソールベースのシンプルな「生徒管理」アプリを作ります。
機能のイメージは次のとおりです。

1.生徒を追加(名前と点数)
2.一覧表示
3.平均点を表示
4.終了

最初は入力ミスなどのエラー処理は最小限でかまいません。
目的は「クラス」「ArrayList」「Scanner」「ループ」を全部まとめて使うことです。

Student クラスを定義する

まずは設計図から。

public class Student {
    String name;
    int score;

    Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    void printInfo() {
        System.out.println("名前: " + name + ", 点数: " + score);
    }
}
Java

シンプルですが、現実世界の「生徒」をそれっぽく表現しています。

メインロジックを書く

Main クラスで、ArrayList と Scanner を使ってメニュー式にします。

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

public class Main {

    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("==== メニュー ====");
            System.out.println("1: 生徒を追加");
            System.out.println("2: 一覧表示");
            System.out.println("3: 平均点を表示");
            System.out.println("0: 終了");
            System.out.print("番号を選んでください: ");

            int choice = scanner.nextInt();
            scanner.nextLine(); // 改行の読み飛ばし

            if (choice == 1) {
                System.out.print("名前: ");
                String name = scanner.nextLine();
                System.out.print("点数: ");
                int score = scanner.nextInt();
                scanner.nextLine();

                Student s = new Student(name, score);
                students.add(s);
                System.out.println("追加しました。");

            } else if (choice == 2) {
                if (students.isEmpty()) {
                    System.out.println("生徒が登録されていません。");
                } else {
                    System.out.println("=== 生徒一覧 ===");
                    for (Student s : students) {
                        s.printInfo();
                    }
                }

            } else if (choice == 3) {
                if (students.isEmpty()) {
                    System.out.println("生徒がいないので平均点を計算できません。");
                } else {
                    int sum = 0;
                    for (Student s : students) {
                        sum += s.score;
                    }
                    double avg = (double) sum / students.size();
                    System.out.println("平均点: " + avg);
                }

            } else if (choice == 0) {
                System.out.println("終了します。");
                break;

            } else {
                System.out.println("無効な入力です。");
            }

            System.out.println();
        }
    }
}
Java

ここで重要なポイントを深掘りします。

1.while(true) + break
「メニューを何回も表示する」ために、無限ループし、終了時に break で抜ける構造です。

2.students.isEmpty()
「何も入っていないか」を簡単にチェックできます。
配列とは違う便利メソッドの一つです。

3.拡張 for 文 for (Student s : students)
ArrayList の要素を順番に取り出して処理するシンプルな書き方。
for (型 変数名 : コレクション) という形で覚えておきましょう。


7 日目:例外処理の入口と、小さなリファクタリング

入力ミスに少しだけ強くする(例外処理の入口)

6 日目のアプリでは、数字を入れるべきところに文字を入れるとエラーで落ちます。
ここで Java の「例外」の存在に少し触れます。

数字の入力部分を try-catch で包んでみます。

try {
    System.out.print("点数: ");
    int score = scanner.nextInt();
    scanner.nextLine();
    // ここまで来れば score はちゃんと整数
} catch (Exception e) {
    System.out.println("数値として読み取れませんでした。0 点として扱います。");
    scanner.nextLine(); // 入力バッファをクリア
    int score = 0;
}
Java

ここでの大事な学びは、

1.「失敗するかもしれない処理」は try-catch で囲っておける
2.catch で「失敗した場合の対応」を自分で決められる

という 2 点です。
初級段階では、例外処理は「存在を知っておく」「落ちたときに怖がらない」くらいで十分です。

コードを少し整理する(リファクタリング)

生徒管理アプリを眺めて、「ここはメソッドに分けた方が読みやすいな」と感じた部分を抜き出してみます。

例えば、平均点計算は別メソッドにできます。

public static double calcAverage(ArrayList<Student> students) {
    int sum = 0;
    for (Student s : students) {
        sum += s.score;
    }
    return (double) sum / students.size();
}
Java

main の中ではこう書けます。

} else if (choice == 3) {
    if (students.isEmpty()) {
        System.out.println("生徒がいないので平均点を計算できません。");
    } else {
        double avg = calcAverage(students);
        System.out.println("平均点: " + avg);
    }
}
Java

この「メソッドに切り出す」という動きが、リファクタリングの第一歩です。
コードの意味ごとの「かたまり」を見つけたら、迷わずメソッドにしていく癖をつけてください。


この初級編で身についたことと、次の一歩

この 7 日間で、あなたは次のようなことを経験しました。

1.Scanner を使って、ユーザーからの入力を受け取る
2.メソッドを「役割ごと」に分けて、分かりやすいコードを書く
3.自分でクラスを定義して、オブジェクトを作り、メソッドでふるまいを持たせる
4.コンストラクタで「作られた瞬間に正しい状態」にする
5.ArrayList を使って、可変長のリストを柔軟に扱う
6.クラス+ArrayList+Scanner で小さなコンソールアプリを作る
7.例外処理の入口と、メソッドへの切り出し(リファクタリング)の感覚をつかむ

これは Java の「本格的なオブジェクト指向」に進むための土台そのものです。

次のステップとしては、例えば以下のような方向があります。

1.クラス同士の関係(「生徒」と「クラス(クラスルーム)」など)を作ってみる
2.継承やインターフェースに触れて、オブジェクト指向に踏み込む
3.ファイル入出力(CSV に書き出す家計簿など)に挑戦する
4.Spring や JavaFX など、実務寄りのフレームワークに触れ始める

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