Java | 2週間で身につく、アプリを作りながら学ぶJavaの基本 - 4日目

Java Java
スポンサーリンク

4日目のゴールとテーマ

4日目のテーマは
「配列で“複数のデータ”をまとめて扱い、ループと組み合わせて処理する」 です。

ここまでで、
1つの値(int や String)を変数に入れて扱うことはできるようになりました。
でも、現実のアプリでは「1つ」だけで済むことのほうが少ないです。

テストの点数が5教科分ある
商品が10個ある
ユーザーが何人もいる

こういうときに、
「変数を5個、10個、100個…」と増やしていくのは現実的ではありません。

そこで登場するのが 配列(array) です。
今日は、

配列とは何か
配列の作り方・使い方
for / for-each と配列の組み合わせ
簡単な「点数管理ミニアプリ」を作る

ここまでを一気に押さえます。


配列とは何かをイメージでつかむ

「同じ型の変数を、番号付きで並べたもの」

まずはイメージからいきましょう。

普通の変数は「1つの箱」です。

int score = 80;
Java

これは「score という名前の箱に 80 が入っている」状態です。

一方、配列は「同じ型の箱が、番号付きでズラッと並んでいる」イメージです。

int[] scores = new int[5];
Java

これは、

int 型の箱が 5個並んでいる
それぞれに 0, 1, 2, 3, 4 という番号が振られている
まとめて scores という名前で呼べる

という状態です。

重要なのは、

配列の「中身の型」は1種類だけ
配列の「長さ」は最初に決める

という2点です。


配列の宣言と作成

「型[] 変数名」で宣言し、「new 型[長さ]」で作る

配列を使うには、2ステップあります。

宣言(この変数は配列ですよ、と宣言する)
作成(実際に中身を持った配列を作る)

例えば、int 型の配列を作る場合はこうです。

int[] scores;          // 宣言
scores = new int[5];   // 作成
Java

1行にまとめて書くこともできます。

int[] scores = new int[5];
Java

ここでの意味を整理します。

int[]
→ 「int 型の配列」という意味
[] が「配列ですよ」という印

scores
→ 配列の名前(変数名)

new int[5]
→ 「int 型の箱を5個並べた配列を作る」
→ 中身は最初、全部 0 で初期化される

配列の長さは [] の中の数字で決まります。
new int[5] なら、要素数は 5 です。


配列の要素にアクセスする

「インデックス(番号)で1つずつ取り出す」

配列の中の1つ1つの要素には、「インデックス」と呼ばれる番号でアクセスします。

例えば、さっきの scores 配列に値を入れてみましょう。

int[] scores = new int[5];

scores[0] = 80;
scores[1] = 75;
scores[2] = 90;
scores[3] = 60;
scores[4] = 100;
Java

ここでのポイントは、

最初の要素は scores[0]
最後の要素は scores[4](長さ5の場合)

ということです。

Javaの配列は「0から始まる」ことを、必ず覚えておいてください。
長さが 5 なら、インデックスは 0〜4。
長さが 10 なら、インデックスは 0〜9。

配列の要素を表示するには、こう書きます。

System.out.println(scores[0]);  // 80
System.out.println(scores[4]);  // 100
Java

配列の初期化を一気に書く方法

「中身が決まっているときは、{} でまとめて書ける」

もし、配列の中身が最初から決まっているなら、
new int[5] と書かずに、こう書くこともできます。

int[] scores = {80, 75, 90, 60, 100};
Java

これは、

長さ5の配列を作る
0番目に 80
1番目に 75
2番目に 90
3番目に 60
4番目に 100

という意味になります。

この書き方は、
「固定のデータを配列に入れておきたい」ときにとても便利です。


配列と for文を組み合わせる

「全要素を順番に処理する」のが一気に楽になる

配列の真価は、for 文と組み合わせたときに発揮されます。

例えば、scores 配列の中身を全部表示したいとします。
1つずつ書くとこうなります。

System.out.println(scores[0]);
System.out.println(scores[1]);
System.out.println(scores[2]);
System.out.println(scores[3]);
System.out.println(scores[4]);
Java

でも、for 文を使えば、こう書けます。

for (int i = 0; i < 5; i++) {
    System.out.println(scores[i]);
}
Java

さらに、配列の長さを使えば、
「5」という数字を直接書かずに済みます。

for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}
Java

ここでの重要ポイントは scores.length です。

配列変数.length
→ その配列の「長さ」(要素数)を返す
→ scores.length は 5

これを使うことで、
「配列の長さが変わっても、for 文を直さなくていい」
という状態にできます。


配列の合計と平均を求める

「ループで回しながら、変数に足していく」

配列を使った典型的な処理として、
「合計」と「平均」を求める例を見てみましょう。

public class Main {
    public static void main(String[] args) {
        int[] scores = {80, 75, 90, 60, 100};

        int sum = 0;

        for (int i = 0; i < scores.length; i++) {
            sum = sum + scores[i];
        }

        double average = (double) sum / scores.length;

        System.out.println("合計点: " + sum);
        System.out.println("平均点: " + average);
    }
}
Java

ここでの深掘りポイントは2つあります。

1つ目は、合計の求め方。

sum = sum + scores[i];
→ 1日目・3日目でやった「合計の育て方」と同じ
→ 今回は i を使って、配列の要素を順番に足している

2つ目は、平均の計算。

double average = (double) sum / scores.length;
→ sum は int(整数)
→ scores.length も int
→ int 同士で割り算すると、小数点以下が切り捨てられてしまう
(double) sum と書いて、sum を一時的に double 型に変換している
→ これにより、「小数点付きの割り算」になる

この (double) のような書き方を「キャスト」と呼びます。
今日は「整数同士の割り算で小数が欲しいときに使う」と覚えておけば十分です。


拡張for文(for-each)で、もっとシンプルに書く

「配列の全要素を順番に処理するだけなら、インデックスすら要らない」

Javaには、配列を回すためのもう1つの書き方があります。
それが「拡張 for 文(for-each)」です。

さっきの合計計算は、こうも書けます。

int[] scores = {80, 75, 90, 60, 100};

int sum = 0;

for (int score : scores) {
    sum = sum + score;
}
Java

読み方としては、

「scores 配列の中の要素を、順番に score という変数に取り出していく」

という感じです。

for (型 変数名 : 配列変数)
→ 配列の全要素を、先頭から順番に取り出してループする
→ インデックス(0, 1, 2, …)を意識しなくてよい

インデックスが必要ない場面(ただ全部なめたいだけのとき)は、
for-each のほうが読みやすくなります。


4日目のミニアプリ:5教科の点数管理アプリ

配列+ループで「まとめて扱う」感覚をつかむ

ここまでの内容を組み合わせて、
「5教科の点数を入力して、合計と平均を表示する」ミニアプリを作ってみましょう。

import java.util.Scanner;

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

        String[] subjects = {"国語", "数学", "英語", "理科", "社会"};
        int[] scores = new int[subjects.length];

        System.out.println("=== 5教科点数管理アプリ ===");

        for (int i = 0; i < subjects.length; i++) {
            System.out.print(subjects[i] + " の点数を入力してください: ");
            scores[i] = scanner.nextInt();
        }

        int sum = 0;
        int max = scores[0];
        int min = scores[0];

        for (int i = 0; i < scores.length; i++) {
            sum = sum + scores[i];

            if (scores[i] > max) {
                max = scores[i];
            }

            if (scores[i] < min) {
                min = scores[i];
            }
        }

        double average = (double) sum / scores.length;

        System.out.println("---------------");
        System.out.println("合計点: " + sum);
        System.out.println("平均点: " + average);
        System.out.println("最高点: " + max);
        System.out.println("最低点: " + min);
    }
}
Java

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

subjects 配列で「教科名」を管理している
"国語", "数学", ... を配列にしておくことで、
→ for 文の中で subjects[i] を使って、教科名と点数をセットで扱える

scores 配列で「点数」を管理している
→ subjects.length と同じ長さで作っている
→ 「教科の数が増えたら、scores も自動的に同じ長さになる」

max と min の初期値を scores[0] にしている
→ 最初の1つ目の点数を「仮の最高点・最低点」としておく
→ 2つ目以降と比べながら、より大きい・小さい値で更新していく

この「配列+ループ+条件分岐」の組み合わせは、
現実のアプリでも頻出パターンです。


配列でよくやってしまうミスと、その防ぎ方

「インデックスの範囲」と「length」の意識

配列を使い始めると、ほぼ確実に一度は出会うエラーがあります。

ArrayIndexOutOfBoundsException

これは、「配列の範囲外のインデックスにアクセスした」ときに出るエラーです。

例えば、長さ5の配列でこう書くとアウトです。

int[] scores = new int[5];

scores[5] = 100;   // ダメ(有効なのは 0〜4)
Java

for 文でも、条件を間違えると同じことが起きます。

for (int i = 0; i <= scores.length; i++) {  // ダメ(<= にしてしまっている)
    System.out.println(scores[i]);          // 最後に scores[length] にアクセスしてしまう
}
Java

正しくは < です。

for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}
Java

防ぎ方としては、

配列を回すときは「0 から length 未満」
i = 0; i < 配列.length; i++ を“型”として覚える

というのが一番強いです。


4日目で一番大事な感覚

「配列は“同じ種類の情報をまとめる棚”」

今日あなたに持ってほしい感覚はこれです。

配列は、単なる「複数の変数の代わり」ではありません。
アプリの中に「同じ種類の情報をまとめて置いておく棚」を作る道具です。

点数の棚
商品価格の棚
ユーザー名の棚

こういう棚を作っておくと、
for 文や for-each で「棚の中身を順番に処理する」ことができるようになります。

配列+ループを使えるようになると、
アプリが一気に「複数のデータを扱える世界」に広がります。


4日目のまとめと、5日目への予告

今日やったことを短く整理すると、

配列は「同じ型の値を、番号付きで並べたもの」
型[] 変数名 = new 型[長さ]; で配列を作る
配列[インデックス] で要素にアクセスする(0から始まる)
配列.length で長さを取得し、for 文と組み合わせる
拡張 for 文(for-each)で、全要素をシンプルに処理できる
配列+ループで、合計・平均・最大・最小などを求められる

5日目は、ここから一歩進んで、
「配列より柔軟に増減できるコレクション(ArrayList)」に触れていきます。
さらに、文字列の扱いも少し深掘りして、
「アプリでよくある“リスト管理”」に近づけていきます。

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