Javaでのプログラミング学習をしていく際に、「なんでこんな機能が用意されているの?」と思うことってありませんか?
今回の記事では、そういった初心者の方には用途がわかりづらいJavaの機能についての解説をしていきたいと思います。
今回は、for文と拡張for文についての解説をします。
Contents
for文とは?
まずは、そもそもfor文とは何なのかという話なのですが、プログラムの中で同じ処理を何回もしたいことってありますよね。
そんな時に、きめられた回数、その処理を繰り返すことができる機能がfor文です。
for文の構成
for文の構成としては、以下の通りになります。
for (変数の初期化;条件式;更新){
繰り返したい処理;
}
変数の初期化
for文では、繰り返した回数を数えるために変数を利用します。
この変数のことをカウント変数といいます。
ここでは、そのカウント変数を初期化します。
例:int i = 0
iというカウント変数に0という値を定義しています。
条件式
先ほどのカウント変数がどうなるまで、この繰り返しを続けるのかという条件を定義する場所です。
例:i < 5
カウント変数iが5未満である限り繰り返しを続けます。
更新式
最後に、カウント変数の更新を行います。
一番よく利用されるのは、++です。
++はインクリメントを表す記号で、指定した変数の値を1増やすことができます。
例:i++
カウント変数iの値を1増やします。
i = i + 1;と同じ意味です。
注意:更新式が書かれていないとiが加算されず、無限ループが発生してしまうので気を付けましょう!
実行例
例えば、以下のコードを使えば、「こんにちは」と5回出力します。
for(int i = 0;i < 5;i++){
//繰り返したい処理を記述
System.out.println(“こんにちは”);
}
流れをトレースすると以下のようになります。
1.カウント変数 i を 0と定義して初期化。
2.iが5以下なので、{}内の処理を実行。
3.println文に従い、こんにちはと出力。
4.i++でiの値が加算されて1に。
5.i=5になるまで繰り返す。
6.i<5の条件から外れたため処理を終了。
これがfor文の一番基本的な文法です。
for文を使って配列の中身を取り出す
このfor文の活用例として、一番よくつかわれるのがこの配列の取り出しです。
まずは実行例を見てみましょう。
実行例
String[] str = {“おはよう”,“こんにちは”,“こんばんは”};
for(int i = 0;i<str.length;i++){
System.out.println(str[i]);
}
まずは、String型の配列strを定義しています。
配列の中身は、
str[0] = “おはよう”
str[1] = “こんにちは”
str[2] = “こんばんは”
となっています。
そして、for文を記述します。
ここで、str.lengthという文章がありますね。
この.lengthを利用すると、その配列の長さを出力することができます。
つまり今回の例でいうと、配列strの長さなので3ですね。
そして、内部の処理に移行します。
内部では、str[i]をprintするとなっていますね。
ここで、配列番号にカウント変数を指定することによって、配列の中身を順次取り出すことができるようになっています。
イメージしやすいように流れをトレースしてみましょう。
1.配列strを定義
2.for文を実行。 カウント変数はi = 0 条件は i < str.length 更新はi++
3.for文内部の処理を実行。 str[i]を出力。
このとき、i = 0のため、「おはよう」を出力。
4.iが加算される。
5.i=1のため処理続行。
6.str[i] を出力
このとき、i = 1のため、「こんにちは」を出力。
7.iが加算される。
8.i = 2のため処理続行。
9.str[i]を出力
このとき、i = 2のため、「こんばんは」を出力。
10.iが加算される。
11. i = 3となり、条件から外れたため、繰り返し処理を終了。
このような順番で処理をしていきます。
条件式に.lengthを指定しているため、自動的にすべての配列が出力されるまで繰り返し処理を続行することができるようになっているわけですね。
拡張for文とは?
for文を利用すると、配列の中身を取り出すことができるという話を先ほどしました。
実は、for文にはもう一つ構文が存在します。
拡張for文といい、配列の取り出しを行うのに特化したfor文です。
とりあえず実行例を見てみましょう。
実行例
String[] str = {“おはよう”,“こんにちは”,“こんばんは”};
for(String greeting : str){
System.out.println(greeting);
}
それでは解説していきます。
先ほどと同じ配列strを定義します。
そして、for文を入れていますが、少し構文が異なりますね。
まず、:の左側でString変数 greetingを定義しています。
そして、:の右側でstr配列を指定しています。
この構文を使うことで、str配列の中身を順次、変数greetingに定義して{}内の処理を行うという意味になります。
これが拡張for文と呼ばれる構文です。
拡張for文を利用することで、通常のfor文のように.lengthを使ったり、カウント変数で配列の要素を指定する必要がなくなります。
シンプルに配列の要素を取り出すだけなら、拡張for文を利用するのが便利ですね。
for文と拡張for文の比較
2つのfor文について紹介しましたが、結局配列を扱う場合はどちらを利用するのがいいのでしょうか?
2つのメリットとデメリットを比較しながら見ていきましょう。
for文
メリット
配列操作において、柔軟な条件指定が可能。
例えば、
String[] str = {“おはよう”,“こんにちは”,“こんばんは”};
for(int i = 1;i<str.length;i++){
System.out.println(str[i]);
}
こうすることによって、「おはよう」を出力せずに「こんにちは」から出力が可能であったり、
String[] str = {“おはよう”,“こんにちは”,“こんばんは”};
for(int i = str.length – 1;i >= 0;i--){
System.out.println(str[i]);
}
こうすることによって、「こんばんは」から逆に出力が可能であったりします。
※str.length – 1 で、配列のインデックスの最大値を表すことができます。
デメリット
細かい条件を指定できる代わりにコードが冗長化しやすい。
Array Index Out Of Bound Exceptionを考慮しなければならない。
※Array Index Out Of Bound Exceptionとは?
要素の入っていない配列のインデックスを指定した際に発生する実行時例外です。
例えば、先ほどの配列は最大 str[2]ですが、ここでstr[3] を出力しようとすると発生します。
配列を操作しているとみることが多い例外なので、しっかりと配列部分にミスがないかを見極めるようにしましょう。
拡張for文ではインデックス値の指定は行わないため、この例外が発生することはありません。
拡張for文
メリット
シンプルな構文での構成が可能なので、コードの可読性が高まる。
書く側としても、例外など難しいことを考える必要がない。
デメリット
配列やリスト以外には利用できません。
配列の特定の位置から繰り返しをスタートしたり、配列の後ろから要素を取り出すといった処理ができません。
あくまでも、配列の最初の要素から取り出すことのみ可能となっています。
総評
こうしてみると、通常のfor文の方では細かい条件の指定が可能であるため、for文の方が利用しやすいのではないかと思われるかもしれません。
ですが、実際の開発業務では、拡張for文の方がよく利用されます。
というのも、そもそも配列から順次値を取り出したいときに、途中から値を取得したり、後ろから値を取り出すなんてことはめったにしません。
であれば、簡潔かつ、見やすいコードを書くことができる拡張for文の方が利用されるのは明白ですね。
じゃあ、通常のfor文は使われないのかというとそんなことはなくて、配列以外の処理には、当然こちらのfor文を利用する必要があります。
拡張for文はあくまでも、配列を順次取り出すための構文です。
どちらかだけを使うという考え方ではなく、ケースバイケースで使い分けるというのを意識するといいですね。
いかがでしょうか?
for文と拡張for文の違いと使い分け方に関しては、理解していただけたでしょうか?
Javaではこのように、似たような機能だけれど使い分け方がいまいち初心者の方には難しいという機能が結構あります。
今後もそのような機能について、順次解説していきたいと思っていますのでご期待ください。