社員が3人いれば、同じ表示の処理を3回行います。同じ処理を何度も行うことを 繰り返し といい、for 文や while 文で書きます。また、3人の名前のように、同じ種類の値をまとめて入れておく入れ物が 配列 です。この章では、繰り返しと配列、そして配列の中身を1つずつ取り出す 拡張 for 文 を学びます。
この章で学ぶこと
-
for文で決まった回数を繰り返す -
while文で条件が成り立つ間を繰り返す - 配列の作り方と、添字で要素を取り出す方法
- 拡張
for文で配列の要素を1つずつ取り出す
6.1 この章で作るもの
この章では、ch06 パッケージに練習用のクラス Loop を作ります。章の最後には、実行するとコンソールに次のように表示されるようになります。
社員ID:1
社員ID:2
社員ID:3
30歳になるまで4年
最初の社員:雷禅 海皇
社員の数:3
1人目:雷禅 海皇
2人目:院照 心愛
3人目:林檎 星飛
雷禅 海皇(26歳)
院照 心愛(27歳)
林檎 星飛(24歳)
年齢の合計:77
| ファイル | 作業 | 内容 |
|---|---|---|
ch06/Loop.java |
新規 | 繰り返しと配列を確かめる練習用のクラス |
6.2 for 文
決まった回数だけ繰り返すときは、for 文を使います。
-
srcを右クリックし、新規 → パッケージ でch06パッケージを作ります。 -
ch06パッケージを右クリックし、新規 → クラス で、名前Loop、「public static void main(String[] args)」に チェックを入れて クラスを作ります。 -
// TODOの行を消して、緑の行を入力します。ch06/Loop.javapackage ch06; public class Loop { public static void main(String[] args) { for (int i = 1; i <= 3; i++) { System.out.println("社員ID:" + i); } } } -
保存して実行します。
コンソール社員ID:1 社員ID:2 社員ID:3
for 文の ( ) の中には、; で区切って3つのことを書きます。
for (初期化; 条件; 更新) {
繰り返す処理
}
| 部分 | 例 | 意味 |
|---|---|---|
| 初期化 | int i = 1 |
繰り返しの最初に1回だけ行う。回数を数える変数 i を 1 にする |
| 条件 | i <= 3 |
繰り返すたびに調べる。true なら処理を行い、false なら繰り返しを終える |
| 更新 | i++ |
処理を1回行うたびに行う。i を 1 増やす |
i は、1 → 2 → 3 と増え、4 になったところで条件 i <= 3 が false になって、繰り返しが終わります。i は for 文の中でだけ使える変数で、for 文の外では使えません。
【知識メモ】回数を数える変数の名前
回数を数える変数には、i という名前がよく使われます(index の頭文字)。for 文を入れ子にするときは、内側に j、k を使います。
6.3 while 文
何回繰り返すかが決まっておらず、「条件が成り立つ間は繰り返す」と書きたいときは、while 文を使います。
while (条件) {
繰り返す処理
}
-
Loop.javaに、26 歳の社員が 30 歳になるまでの年数を数える処理を書き足します。ch06/Loop.javapackage ch06; public class Loop { public static void main(String[] args) { for (int i = 1; i <= 3; i++) { System.out.println("社員ID:" + i); } int age = 26; int years = 0; while (age < 30) { age++; years++; } System.out.println("30歳になるまで" + years + "年"); } } -
保存して実行します。最後に
30歳になるまで4年と表示されます。コンソール社員ID:1 社員ID:2 社員ID:3 30歳になるまで4年
while 文は、まず条件を調べ、true なら処理を行って、また条件を調べる、という動きを繰り返します。age が 30 になると条件が false になり、繰り返しが終わります。
【ご注意】終わらない繰り返し(無限ループ)
while の中で age++; を書き忘れると、条件がいつまでも true のままで、プログラムが終わらなくなります。コンソールのタブに「<終了>」が付かないときは、この状態です。コンソールのツールバーにある赤い四角の 終了ボタン をクリックして止めてください。
while 文を書くときは、「条件がいつか false になるか」を必ず確かめてください。
6.4 配列
3人の社員の名前を、name1・name2・name3 と別々の変数に入れると、人数が増えるたびに変数を足すことになります。同じ種類の値をまとめて入れるには、配列 を使います。
-
Loop.javaに緑の行を書き足します。ch06/Loop.java(main メソッドの後半)System.out.println("30歳になるまで" + years + "年"); String[] names = {"雷禅 海皇", "院照 心愛", "林檎 星飛"}; System.out.println("最初の社員:" + names[0]); System.out.println("社員の数:" + names.length); for (int i = 0; i < names.length; i++) { System.out.println((i + 1) + "人目:" + names[i]); } } } -
保存して実行します。
コンソール(後半)最初の社員:雷禅 海皇 社員の数:3 1人目:雷禅 海皇 2人目:院照 心愛 3人目:林檎 星飛
| コード | 意味 |
|---|---|
String[] names = {…}; |
String の配列 names を作り、3つの値を入れる。型の後ろの [] が「配列」の印 |
names[0] |
配列の最初の要素。[ ] の中の番号を 添字 といい、0 から始まる
|
names.length |
配列の要素の数。length の後ろに ( ) は付けない(String の length() とは違う) |
for (int i = 0; i < names.length; i++) |
添字を 0 から「要素の数 − 1」まで動かす、配列の繰り返しの決まった書き方 |
【ご注意】添字は 0 から始まる
3つの要素の添字は 0・1・2 です。names[3] のように、無い添字を使うと、実行したときに ArrayIndexOutOfBoundsException というエラーが起きてプログラムが止まります(第12章)。「〜人目」のように 1 から数えた番号を表示したいときは、上のコードのように i + 1 を表示します。
要素の数だけ先に決める書き方
値が後から決まるときは、要素の数だけを決めて配列を作り、添字を指定して値を入れます。値を入れる前の要素には、int なら 0、String なら null が入っています。
int[] ages = new int[3]; // int を3つ入れられる配列。最初はすべて 0
ages[0] = 26;
ages[1] = 27;
ages[2] = 24;
new は、「新しく作る」という意味の予約語です。第8章で、クラスからオブジェクトを作るときにも使います。
6.5 拡張 for 文
配列の要素を最初から最後まで1つずつ取り出すだけなら、添字を使わない 拡張 for 文 のほうが簡単に書けます。
for (要素の型 変数名 : 配列) {
取り出した要素を使う処理
}
-
Loop.javaのmainメソッドの最後に、緑の行を書き足します。ch06/Loop.java(main メソッドの最後)for (int i = 0; i < names.length; i++) { System.out.println((i + 1) + "人目:" + names[i]); } int[] ages = {26, 27, 24}; for (int i = 0; i < names.length; i++) { System.out.println(names[i] + "(" + ages[i] + "歳)"); } int total = 0; for (int a : ages) { total += a; } System.out.println("年齢の合計:" + total); } } -
保存して実行します。
コンソール(後半)雷禅 海皇(26歳) 院照 心愛(27歳) 林檎 星飛(24歳) 年齢の合計:77
for (int a : ages) は、「ages の要素を先頭から1つずつ取り出して a に入れ、{ } の中を実行する」という意味です。: は「〜の中の」と読みます。添字を書かないので、範囲外のエラーが起きません。
名前と年齢のように、2つの配列を同じ添字で対応させるときは、添字が必要なので、ふつうの for 文を使います。1つの配列の要素を順に使うだけなら、拡張 for 文を使います。
【知識メモ】Spring入門の繰り返し
Spring入門では、社員の一覧を画面に表示するときに、テンプレートで th:each="employee : ${employees}" と書きます。これは、拡張 for 文の for (Employee employee : employees) と同じ考え方です。第11章では、配列の代わりに List という入れ物に対して拡張 for 文を使います。
【知識メモ】main メソッドの String[] args
main(String[] args) の String[] args は、String の配列です。プログラムを起動するときに外から渡される値が入りますが、この教材では使いません。
6.6 うまくいかないときは
| 症状 | 考えられる原因と対処 |
|---|---|
| プログラムが終わらない(コンソールに「<終了>」が付かない) |
while の条件がいつまでも true です。コンソールの赤い終了ボタンで止め、繰り返しの中で条件に使う変数を変えているかを確かめてください。詳しくは 付録A「よくある実行時のエラー」 を見てください。 |
ArrayIndexOutOfBoundsException が表示されて止まる |
配列に無い添字を使っています。添字は 0 から「要素の数 − 1」までです。for 文の条件を i <= names.length と書いていないか確かめてください(正しくは <)。詳しくは 付録A「よくある実行時のエラー」 を見てください。 |
| 「i を変数に解決できません」 |
for 文の中で宣言した i を、for 文の外で使っています。i は for 文の中でだけ使えます。 |
「型の不一致: 要素タイプ String から int には変換できません」が for (int a : names) で出る |
拡張 for 文の変数の型が、配列の要素の型と合っていません。names は String の配列なので、for (String name : names) と書きます。 |
| 「length() を配列型 String[] で起動できません」 | 配列の要素の数は names.length で、( ) を付けません。 |
ほかのエラーは、付録A「よくあるコンパイルエラー」・付録A「よくある実行時のエラー」 も参考にしてください。
6.7 まとめと確認問題
まとめ
-
for (初期化; 条件; 更新) { }で決まった回数を繰り返す。条件がfalseになると終わる -
while (条件) { }で条件が成り立つ間を繰り返す。条件がいつかfalseになるように書く -
配列 は
String[] names = {…};やint[] ages = new int[3];で作る。要素はnames[添字]で取り出し、添字は 0 から。要素の数はnames.length -
拡張 for 文
for (String name : names) { }で、要素を先頭から1つずつ取り出せる
この章で使った書き方は、付録B「文法早見表」の「条件分岐と繰り返し」 にまとめています。
確認問題
問1 for (int i = 0; i < 3; i++) と書くと、i の値は何から何まで変わりますか。また、何回繰り返しますか。
解答を見る
0、1、2 と変わり、3回繰り返します。i が 3 になると条件が false になって終わります。
問2 String[] depts = {"営業部", "総務部", "開発部"}; のとき、depts[1] と depts.length はそれぞれ何ですか。
解答を見る
depts[1] は "総務部"(添字は 0 から始まるので、2番目の要素)、depts.length は 3 です。
問3 問2の配列の要素をすべて表示するコードを、拡張 for 文で書いてください。
解答を見る
for (String dept : depts) { System.out.println(dept); }
問4 次の while 文の問題点は何ですか。int count = 0;while (count < 3) { System.out.println(count); }
解答を見る
count の値を変えていないので、条件がいつまでも true のままになり、プログラムが終わりません(無限ループ)。{ } の中に count++; を書きます。

