Java超|7章のまとめ

たくさんのデータは、配列でひとまとまりに整理する。
7章を理解すると、Javaで「集める」「取り出す」「順番に処理する」「並べ替える」「表にする」力が身につく。

7章では、Javaで複数のデータを効率よく扱うための大切な仕組みとして、配列を学びました。

これまでの変数は、基本的に「1つの名前に1つの値」を入れるものでした。

たとえば、1人分の点数、1日の修行記録、1つの補給品価格のような単独の値なら、普通の変数で十分です。

int score = 80;

しかし、実際のプログラムでは、1つだけではなく、同じ種類のデータをたくさん扱う場面がよくあります。

たとえば、戦士たちの訓練点数、数日分の修行記録、補給品の価格一覧、訓練科目ごとの成績表などです。

こうしたデータを1つずつ別々の変数で管理していると、変数名がどんどん増えてしまいます。

int score1 = 80;
int score2 = 75;
int score3 = 90;

少ない数ならまだ見えますが、30人分、50人分、100人分になると、コードは一気に読みにくくなります。
さらに、合計を求める、平均を出す、最大値を探す、並べ替えるといった処理も書きづらくなります。

そこで役立つのが配列です。

配列を使うと、同じ型のデータを1つのまとまりとして管理できます。

さらに、for文と組み合わせて順番に処理したり、lengthで要素数に合わせて繰り返したり、拡張for文で中身をすっきり取り出したり、ソートで順番を整えたり、多次元配列で表のようなデータを扱ったりできるようになります。

ドラゴンボール風にたとえると、配列は「戦士たちの記録札を番号付きの訓練棚にまとめて保管する仕組み」です。

1枚ずつばらばらに持つのではなく、同じ種類の札を棚に並べておくことで、先頭から順に確認したり、必要な札を取り出したり、強い順に並べ替えたりできます。

7章で学んだ内容は、Javaの基本文法の中でもかなり重要な土台です。

ここでは、配列の考え方、宣言と確保、添字、初期化、length、配列変数の代入、拡張for文、ソート、多次元配列までを、ドラゴンボール風の世界観を交えながら、ていねいに振り返っていきます。

配列は同じ種類のデータをまとめて扱う仕組み

配列でまず大切なのは、同じ型の値を複数まとめて扱う仕組みだということです。

普通の変数では、1つの変数に1つの値を入れます。

たとえば、1人分の修行点数だけを扱うなら、変数で十分です。

int score = 80;

でも、戦士50人分の点数を扱いたい場合はどうでしょうか。

int score1 = 80;
int score2 = 75;
int score3 = 90;

このように変数を増やしていくと、数が増えるほど管理が大変になります。

管理方法特徴
変数を増やす少数なら分かりやすいが、大量になると大変
配列を使う同じ型のデータを1つのまとまりとして扱える

ドラゴンボール風にたとえると、1人分の修行点数なら「1枚の点数札」で十分です。

でも、戦士が50人いるなら、50枚の札をばらばらに持つより、番号付きの記録棚にまとめたほうがずっと扱いやすくなります。

配列は、このように「同じ種類のデータがたくさんある場面」で力を発揮します。

変数を増やすだけでは管理が難しくなる

同じ種類のデータを別々の変数で管理すると、次のような問題が起きやすくなります。

問題点内容
コードが長くなる似たような変数宣言が大量に並ぶ
ミスが増えるscore17 と score18 のような取り違えが起きやすい
処理を書きにくい合計や平均を求めるときに1つずつ書く必要がある
修正が大変人数やデータ数が変わると、直す場所が増える

たとえば、戦士50人分の修行点数の合計を出したい場合、変数を1つずつ足していくのは現実的ではありません。

配列を使えば、点数を1つのまとまりとして管理でき、さらにループで順番に処理できます。

ドラゴンボール風にたとえると、ばらばらの点数札を1枚ずつ探して足し算するより、棚に並んだ札を0番から順番に確認するほうがずっと楽です。

配列を使うとデータのまとまりが見える

配列を使うと、同じ種類のデータが「1つのまとまり」として見えるようになります。

データ配列で扱うイメージ
戦士全員の点数scores
1週間の修行回数trainingCounts
補給品の価格prices
日ごとの読書時間reading
月ごとの売上sales

配列名を見れば、そのデータのまとまりが何を表しているのかが分かりやすくなります。

たとえば、scores という配列名なら「点数のまとまり」、prices という配列名なら「価格のまとまり」と考えられます。

配列は、単に値を入れる箱ではありません。

プログラムの中で「同じ種類のデータをまとめる」という考え方そのものを表す大切な仕組みです。

配列は宣言してから要素を確保する

配列を使うには、まず配列変数を宣言し、そのあとで要素を確保します。

たとえば、整数を5個入れられる配列を準備する流れは、次のようになります。

int[] data;
data = new int[5];

この2つの文には、それぞれ役割があります。

書き方役割
int[] data;int型の配列を扱う変数 data を用意する
data = new int[5];int型の要素を5個持つ配列を作る

ここで大切なのは、宣言しただけでは、まだ値を入れる箱はできていないという点です。

int[] data;

この段階では、data という配列変数を用意しただけです。
実際に値を入れる場所は、まだありません。

data = new int[5];

このように new を使って、はじめて5個分の要素が用意されます。

ドラゴンボール風にたとえると、int[] data; は「記録棚に data という名前札を用意する」段階です。

data = new int[5]; は「その名前札の先に、5つの引き出しを持つ棚を作る」段階です。

名前札だけでは記録札は入れられません。
引き出しを作って、はじめて値をしまえるようになります。

宣言と確保の違いを整理する

配列の宣言と要素の確保は、似ているようで別の作業です。

作業意味ドラゴンボール風のイメージ
宣言配列を扱う変数を用意する記録棚の名前札を作る
要素の確保実際に値を入れる箱を作る引き出しを必要な数だけ並べる
代入各要素に値を入れる引き出しに記録札を入れる

この流れをしっかり分けて理解しておくと、配列の仕組みがかなり分かりやすくなります。

特に、配列は普通の変数より少し特別です。

普通の int 変数は、宣言して値を入れれば、1つの数を扱えます。

でも配列では、配列変数を用意したあと、new で要素を確保する必要があります。

この「名前」と「実体」を分けて考える感覚は、今後のJava学習でもとても大切です。

配列要素には添字でアクセスする

配列の中に値を入れたり、取り出したりするときは、添字を使います。

添字は、配列の中の場所を表す番号です。

data[0] = 10;
data[1] = 20;
data[2] = 30;

このように、配列名のあとに [ ] を付け、その中に番号を書きます。

書き方意味
data[0]data 配列の0番目の要素
data[1]data 配列の1番目の要素
data[2]data 配列の2番目の要素

Javaの配列では、最初の添字は 0 です。

ここはとても重要です。

人間の数え方Javaの添字
1個目0
2個目1
3個目2
4個目3
5個目4

つまり、要素数が5個なら、使える添字は0から4までです。

ドラゴンボール風にたとえると、5つの引き出しを持つ訓練記録棚では、番号札が0番、1番、2番、3番、4番と付いています。

5個あるからといって、5番の引き出しがあるわけではありません。

最後の添字は要素数 - 1

配列でよくつまずくのが、最後の添字です。

要素数が5なら、最後の添字は4です。
要素数が10なら、最後の添字は9です。

要素数使える添字最後の添字
30, 1, 22
50, 1, 2, 3, 44
100から99

最後の添字は 要素数 - 1 になります。

これは、for文で配列を処理するときにも大切です。

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

この形では、i は0から data.length - 1 まで進みます。

だから、配列の範囲を超えずに要素を処理できます。

ドラゴンボール風にたとえると、記録棚の巡回では、最初の0番から始まり、最後の 要素数 - 1 番で終わるのが正しい動きです。

図:7章で学んだ配列の基本構造

この図が示していること

この図では、配列の基本構造を示しています。

data という配列名のもとに、5つの要素が横一列に並んでいます。
それぞれの要素には、0、1、2、3、4 という添字が付いています。

ここから分かることは、配列は値をただ並べるだけではなく、添字という番号で場所を指定して扱う仕組みだということです。

また、配列を使う流れとして、宣言、要素の確保、値の代入、ループ処理がつながっていることも確認できます。

配列は初期化でまとめて準備できる

配列は、宣言して、new で要素を確保して、1つずつ値を代入する方法で使えます。

ただし、最初から入れる値が決まっている場合は、もっと短く書けます。

int[] data = {10, 20, 30, 40, 50};

この書き方を配列の初期化といいます。

この1行で、次の3つをまとめて行っています。

行われること内容
配列変数の宣言data を用意する
要素の確保値の数に合わせて要素を作る
値の代入左から順に値を入れる

この場合、値が5個あるので、要素数も5になります。

添字は0から4までです。

添字
010
120
230
340
450

ドラゴンボール風にたとえると、初期化は「記録棚を作ると同時に、最初から記録札を入れておく」方法です。

あとから1枚ずつ札を入れるより、決まったデータをまとめて準備しやすくなります。

初期化が向いている場面

配列の初期化は、最初から値が決まっているときに便利です。

場面初期化が向いている理由
学習用のデータ値の一覧がすぐ見える
固定の記録最初から内容が決まっている
設定値の一覧まとめて書くと読みやすい
テスト用の配列データをすぐ準備できる

一方で、実行時に入力された人数や個数に合わせて配列を作る場合は、new で要素数を指定してから、あとで値を代入する方法が向いています。

状況向いている書き方
最初から値が決まっている初期化
値をあとから入力するnew で確保してから代入
要素数が実行時に決まるnew int[num] のような形

配列には複数の準備方法があります。

大切なのは、どの書き方でも「同じ型の値をまとめて扱う」という本質は同じだということです。

配列とfor文は相性がよい

配列を学ぶうえで、for文との組み合わせはとても重要でした。

配列の要素には、0、1、2、3 のように添字が付いています。

for文のループ変数も、0、1、2、3 のように変化させられます。

この2つは、とても相性がよいです。

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

この形では、i が0から data.length - 1 まで変化します。

そのため、data[0]、data[1]、data[2]……というように、配列の要素を順番に処理できます。

i の値扱う要素
0data[0]
1data[1]
2data[2]
3data[3]

ドラゴンボール風にたとえると、for文は「記録棚を0番から順番に見回る巡回役」です。

配列は記録棚。
添字は引き出し番号。
i は巡回中の現在位置です。

この組み合わせによって、たくさんのデータを順番に処理できます。

配列とfor文でできること

配列とfor文を組み合わせると、たくさんの処理が書きやすくなります。

処理内容
全要素の表示先頭から最後まで順番に表示する
合計を求める各要素を順番に足す
平均を求める合計を要素数で割る
最大値を探す値を1つずつ比較する
条件に合う値を探すif文と組み合わせて判定する
並べ替える添字を使って要素を比較・交換する

配列だけでは、値をまとめて保存するだけです。

for文と組み合わせることで、そのデータを順番に処理できるようになります。

この「配列 + ループ」の考え方は、Javaの基本としてとても重要です。

lengthで配列の要素数を扱う

配列には length があります。

data.length

これは、配列が持っている要素数を表します。

書き方意味
data[0]0番目の要素
data[1]1番目の要素
data.lengthdata 配列の要素数

たとえば、data に5個の要素があるなら、data.length は5です。

ここで注意したいのは、length は最後の添字ではないという点です。

要素数length最後の添字
554
10109

最後の添字は length - 1 です。

そのため、for文では次のように書くのが基本です。

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

i < data.length とすることで、i は0から length - 1 まで進みます。
これにより、配列の範囲内だけを安全に処理できます。

固定の数字よりlengthが便利な理由

for文の条件に固定の数字を書くこともできます。

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

ただし、この書き方では、配列の要素数が変わったときに修正が必要になります。

書き方特徴
i < 5要素数が変わると修正が必要
i < data.length配列の大きさに合わせて動きやすい

たとえば、配列の要素数を5個から7個に増やしたのに、for文が i < 5 のままだと、6個目と7個目は処理されません。

length を使えば、配列の要素数に合わせて自然に繰り返せます。

ドラゴンボール風にたとえると、固定の数字は「今日は5枚だけ記録札を見る」と決め打ちする巡回です。

length は「棚にある札の枚数を確認して、その分だけ見回る」巡回です。

記録札が増えても対応しやすいのは、length を使う方法です。

配列変数の代入では同じ配列を共有する

7章の中でも少し難しいけれど大切だったのが、配列変数どうしの代入です。

たとえば、次のような形を考えます。

int[] a = {10, 20, 30};
int[] b;
b = a;

この場合、a の配列が丸ごとコピーされて、b 用の別の配列ができるわけではありません。

b は a と同じ配列を指すようになります。

考え方正しいか
a の配列がコピーされて b 用の別配列ができる×
a と b が同じ配列を共有する

そのため、a から配列の中身を変更すると、b から見ても変更後の値が見えます。

ドラゴンボール風にたとえると、a は記録棚への案内札です。

b = a とすると、b も同じ記録棚への案内札になります。

棚が2つに増えるのではなく、同じ棚を見る案内札が2枚になるだけです。

配列変数は参照型として考える

配列変数は、配列本体を直接持っているというより、配列本体を指す情報を持っています。

このような変数を、参照型の変数として考えます。

種類変数が持つもの
基本型の変数値そのもの
配列変数配列本体の場所を示す情報

int のような基本型では、代入すると値そのものが渡される感覚です。

でも配列変数では、同じ配列を指すようになります。

この参照の考え方は、今後クラスやオブジェクトを学ぶときにもつながります。

ドラゴンボール風にたとえると、基本型の変数は「点数が書かれた札そのもの」です。

配列変数は「記録棚の場所を示す案内札」です。

案内札を渡すと、相手も同じ棚を見られるようになります。

拡張for文で配列要素を簡単に取り出す

7章の後半では、拡張for文も学びました。

拡張for文は、配列の中身を順番に取り出すためのシンプルな書き方です。

for(int value : data){
    System.out.println(value);
}

この書き方では、data 配列の要素が先頭から順番に value に入ります。

繰り返しvalue に入る値のイメージ
1回目data の先頭の値
2回目次の値
3回目さらに次の値

通常のfor文では、添字を使います。

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

拡張for文では、添字を書かずに、値そのものを取り出します。

書き方特徴
通常のfor文添字を使える
拡張for文添字なしですっきり処理できる

ドラゴンボール風にたとえると、通常のfor文は「0番札、1番札、2番札と番号を確認しながら読む」方法です。

拡張for文は「棚の札を先頭から順に受け取り、中身だけを読み上げる」方法です。

拡張for文が向いている場面

拡張for文は、配列の全要素を順番に読むだけの処理に向いています。

やりたいこと向いている書き方
全要素を表示する拡張for文
全要素を順番に確認する拡張for文
添字も表示したい通常のfor文
値を入れ替えたい通常のfor文
特定の位置を操作したい通常のfor文

拡張for文は読みやすく、範囲外アクセスも起きにくい便利な書き方です。

ただし、何番目の要素かを使いたいときや、要素を入れ替えるような処理では、通常のfor文のほうが向いています。

ソートで配列の中身を並べ替える

配列は、ただ値を保存するだけではありません。

中身を並べ替えることもできます。

この並べ替えのことを、ソートといいます。

たとえば、次のような値があるとします。

22, 80, 57, 60, 50

これを大きい順に並べると、次のようになります。

80, 60, 57, 50, 22

このように、決まったルールに従って順番を整える処理がソートです。

ドラゴンボール風にたとえると、ソートは「戦士の戦績札を、得点の高い順に並べ替える作業」です。

ばらばらに並んでいた札を、強い順、重要な順、価格の高い順などに整列させます。

ソートでは比較と入れ替えを行う

基本的なソートでは、要素どうしを比較し、必要なら入れ替えます。

処理内容
比較2つの値の大小を見る
入れ替え条件に合うように順番を交換する
繰り返しすべての位置で同じ処理を続ける

値を入れ替えるときには、一時保存用の変数を使います。

int tmp = data[j];
data[j] = data[i];
data[i] = tmp;

tmp は、片方の値を一時的に避難させるための変数です。

一時保存をせずに上書きしてしまうと、片方の値が消えてしまいます。

ドラゴンボール風にたとえると、2枚の記録札を入れ替えるときに、1枚をいったん仮置き台に置いてから交換するようなものです。

仮置き台が tmp です。

図:7章で学んだ配列操作の全体像

この図が示していること

この図では、7章で学んだ配列の内容が、すべて「配列」を中心につながっていることを示しています。

配列を使うには、まず宣言し、newで要素を確保します。

値を扱うときは添字を使い、最初から値が決まっている場合は初期化を使えます。

配列の長さは length で確認できます。

配列変数どうしを代入すると、同じ配列を共有します。

拡張for文を使うと、要素をすっきり順番に取り出せます。

ソートでは順番を整え、多次元配列では表のようなデータを扱えます。

ここから分かることは、7章で学んだ内容はバラバラではなく、「たくさんのデータをどう整理し、どう処理するか」という1つの流れにつながっているということです。

多次元配列で表のようなデータを扱う

7章の最後では、多次元配列も学びました。

1次元配列は、横一列に並んだデータです。

10, 20, 30, 40

2次元配列は、行と列を持つ表のようなデータです。

10  20  30
40  50  60

2次元配列は、次のように宣言できます。

int[][] table = new int[2][3];

この場合、2行3列の配列です。

行数列数合計要素数
236

値を扱うときは、添字を2つ使います。

table[0][0]
table[1][2]
書き方意味
table[0][0]0行0列
table[0][1]0行1列
table[1][2]1行2列

ドラゴンボール風にたとえると、2次元配列は「修行任務の記録表」です。

1つ目の添字で行、2つ目の添字で列を指定します。

たとえば、行が訓練科目、列が戦士なら、どの訓練科目のどの戦士の点数かを表せます。

多次元配列のlengthは使い分ける

多次元配列では、length の使い方が少し変わります。

data.length
data[i].length

この2つは意味が違います。

書き方意味
data.length行の数
data[i].lengthi行目の要素数

たとえば、次のような配列を考えます。

int[][] data = {
    {10, 20, 30},
    {40, 50},
    {60, 70, 80, 90}
};

この場合、行ごとの長さは違います。

要素数
03
12
24

data.length は、行が3つあるので3です。

data[0].length は3、data[1].length は2、data[2].length は4です。

ドラゴンボール風にたとえると、data.length は「任務班が何班あるか」です。

data[i].length は「その班に戦士が何人いるか」です。

班の数と、各班の人数は別のものとして考える必要があります。

7章で学んだ内容を一覧で整理する

7章では、配列について幅広く学びました。

項目内容
配列の宣言配列を扱う変数を用意する
要素の確保newで必要な数の要素を準備する
値の代入添字を使って各要素に値を入れる
添字0から始まる位置番号
初期化{ } を使ってまとめて準備する
for文との組み合わせ配列を順番に処理する
length配列の要素数を調べる
配列変数の代入同じ配列を共有する
拡張for文要素を簡単に順番に取り出す
ソート配列のデータを並べ替える
多次元配列表のようなデータを扱う

この表を見ると、7章では配列を「作る」だけでなく、「使う」「処理する」「並べ替える」「表として扱う」ところまで学んできたことが分かります。

配列はJavaを学ぶうえで欠かせない基本機能

配列は、Javaの基本文法の中でもとても重要です。

なぜなら、実際のプログラムでは「同じ種類のデータをたくさん扱う」場面がとても多いからです。

実用的な場面配列が役立つ理由
成績一覧複数人の点数をまとめられる
売上一覧月ごとの数値を扱える
出席記録日ごとの出席状況をまとめられる
商品価格商品ごとの価格を管理できる
表形式データ多次元配列で行と列を扱える

配列を理解すると、プログラムの中でデータを整理する力がつきます。

ドラゴンボール風にたとえると、配列は「修行記録を整えるための基本の棚」です。

記録札が増えても、棚に並べれば管理しやすくなります。

さらに、巡回役であるfor文を使えば、順番に確認できます。

必要に応じて並べ替えれば、重要な記録を前に出すこともできます。

配列の考え方は今後の学習にもつながる

配列を理解しておくと、この先のJava学習がかなり進めやすくなります。

今後の内容配列とのつながり
メソッド配列を引数として渡す場面が出てくる
クラス参照型の考え方が理解しやすくなる
オブジェクト変数が本体を指す感覚につながる
コレクションたくさんのデータを扱う考え方につながる
アルゴリズム探索や並べ替えで配列を使う

配列変数の代入で学んだ「同じ配列を共有する」という感覚は、クラスやオブジェクトを学ぶときにも役立ちます。

ドラゴンボール風にたとえると、配列変数は「記録棚への案内札」でした。

この案内札の考え方は、今後、戦士情報クラスや任務記録クラスのようなオブジェクトを扱うときにもつながります。

1つの値なら変数、同じ種類が複数なら配列、表なら多次元配列

7章を通して、データの形に応じて使う仕組みを選ぶ考え方も身につきました。

扱いたいデータ向いている仕組み
1つの値変数
同じ種類の値が複数配列
行と列で整理したいデータ多次元配列

この使い分けができると、プログラム全体がすっきりします。

たとえば、1人の点数だけなら変数で十分です。

戦士全員の点数なら配列が向いています。

戦士ごとの訓練科目別成績なら、2次元配列が自然です。

ドラゴンボール風にたとえると、次のようになります。

データの形イメージ
1つの値1枚の点数札
同じ種類が複数番号付きの記録棚
表形式行と列を持つ大きな成績表

このように、データの形に合わせて入れ物を選ぶことが大切です。

図:変数・配列・多次元配列の使い分け

この図が示していること

この図では、扱いたいデータの形に応じて、変数、配列、多次元配列を使い分ける考え方を示しています。

左側の変数は、1つの値を扱うときに向いています。

中央の配列は、同じ種類の値が複数あるときに向いています。

右側の多次元配列は、行と列で整理したい表形式のデータに向いています。

ここから分かることは、Javaでは「どんな形のデータを扱いたいのか」によって、適した入れ物を選ぶことが大切だということです。

配列を理解するとプログラムが整理しやすくなる

配列は、ただの文法ではありません。

たくさんのデータをどう整理し、どう処理するかを考えるための道具です。

7章で学んだ内容を使うと、次のような力が身につきます。

身につく力内容
データをまとめる力同じ型の値を1つのまとまりにできる
順番に処理する力for文や拡張for文で全要素を扱える
安全に扱う力lengthで要素数に合わせて処理できる
参照を理解する力配列変数の代入で共有されることが分かる
データを整える力ソートで順番を並べ替えられる
表を扱う力多次元配列で行と列を表現できる

配列は、Javaの実践的な処理に進むための大きな土台です。

データをまとめて扱えるようになると、コードは短くなり、読みやすくなり、修正もしやすくなります。

さらに、配列とループを組み合わせることで、合計、平均、検索、並べ替えなど、さまざまな処理につなげられます。

7章の学びはJavaプログラミングの土台になる

7章で学んだ配列の内容は、この先も何度も登場します。

宣言、要素の確保、添字、初期化、length、配列変数の代入、拡張for文、ソート、多次元配列。

どれも、Javaでデータを扱ううえで欠かせない考え方です。

ドラゴンボール風にたとえると、7章は「戦士たちの記録を整理し、確認し、並べ替え、表として扱う訓練」でした。

1枚の札だけを見るのではなく、たくさんの札を棚に並べ、必要な順番で見ていく。

さらに、大きな修行記録表として、行と列で管理する。

この感覚が身につくと、Javaで扱えるデータの幅が一気に広がります。

配列は、値を入れるだけの箱ではありません。

たくさんのデータを整理し、順番に処理し、必要に応じて整えるための、Javaの大切な基本機能です。