今回もJava言語セミナーを受講した時のことをメモしていきたいと思います。
繰り返し文
Javaでは繰り返し文として、
- while文
- do while文
- for文
- 拡張for文
があるようです。繰り返し処理のことをループと一般的には呼ぶようです。
while文
while文は条件式がtrueの間、繰り返し処理を行います。
処理文が一行しかない場合は、{ }を省略できるようです。
while(条件式){ 処理文; //条件式がtrueの間、処理文が実行されます }
実際にプログラムでwhile文を試してみます。
class sample_test06{ public static void main(String[] args){ int num = 0; while(num < 10){ System.out.println("numの値は" + num + "です。"); num++; } System.out.println("while文から抜けた後に表示されます。"); } }
numが0から始まって、条件式(num < 10)と比較しtrueが返って5行目の処理をして6行目の処理でnumが+1されるので、num = 1になり、このnumと条件式(num < 10)を比較し・・・という流れで繰り返され、条件式(num < 10)がfalse(num = 10)になったときwhile文のループを抜け、8行目の処理に移ります。
do - while文
while文と異なる点は、まずはじめに処理が行われてから条件式による判定が行われるところです。条件によらず必ず一度は処理が行われます。
while文と同様に処理文が一行のみのときは{ }が省略できるようです。
do{ 処理文; }while(条件式);
実際にプログラムでdo-while文を試します。
class sample_test07{ public static void main(String[] args){ int x = 5; do{ ++x; System.out.println(x + " "); }while(x == 6); System.out.println("do-while文を抜けた後に表示されます。"); } }
5行目でxが+1され、x=6になり、6行目が処理され、条件式(x == 6)と比較しtrueが返るので、また5行目の処理が実行されx=7となり、6行目が処理され、条件式(x == 6)と比較し、今度はfalseが返るので8行目に処理が移ります。
無限ループ
条件式が常にtrueとなる場合、処理が行われ、条件式でtrueが返り、処理が行われ、条件式でtrueが・・・のように永久に繰り返しが続くことになります。
これを、無限ループと呼びます。
少しだけ耐えられるということ―― それは永遠に耐えられるということ(『餓狼伝』 by片岡輝夫)ということですが、無限ループになってしまった場合は『Ctrl + C』でループを終了させられます。
実際に無限ループになるプログラムを確認。
class sample_test08{ public static void main(String[] args){ for(int i = 3; i < ++i; i++){ System.out.print(i + " "); //print()は改行しないで表示 } System.out.println(); } }
条件式がi < ++i;と常にtrueとなってしまうので、永久に繰り返しが行われてしまいます。実行してしまった場合は『Ctrl + C』でループを終了させましょう。
for文
無限ループの説明の例で使ってましたが、for文の基本的な形は下記の通りですが、記述の仕方がいろいろあります。
for(変数宣言と初期化; 条件式; 変数の更新;){ 処理文; }
実際にプログラムでfor文を確認します。
class sample_test09{ public static void main(String[] args){ for(int i = 0; i < 8; i++){ System.out.println("i = " + i); } } }
i = 8になったときに条件式(i < 8;)がfalseとなって処理が終了します。
次は、基本形以外の書き方の例です。
class sample_test10{ public static void main(String[] args){ int count1 = 0; for(count1 < 5; count1++){ System.out.print(count1); } System.out.println("1つ目のfor文が終了した後に実行されます。"); //改行 for(int count2 = 0; count2 < 5;){ System.out.print(count2++); } } }
基本形以外の書き方は可読性が下がるので、実務では基本形のfor文の記述の仕方をしていくことが良いようです。基本は大事です。
拡張for文
配列やコレクション(Collection)の全要素に対して順番に取り出して処理していくことができるようです。PHPでいうところのforeach文みたいなものでしょうか?
拡張for文も処理文が一行のみのときは{ }が省略できるようです。
for(変数宣言(配列の要素を格納する変数) : 参照変数名(配列)){ 処理文; }
変数宣言のデータ型は、参照変数名のデータ型と同じデータ型にする必要があります。
拡張for文のイメージ図
コレクション(Collections)はクラス型の1つで、public class Collections extends Objectと書かれるように、Objectクラスを継承したクラスです。(クラスなどについては後述していく予定です。)
で、このObjectクラスは何かというと、
「Objectクラスは、クラス階層のルートです。すべてのクラスは、スーパー・クラスとしてObjectを持ちます。配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。」
というように、どんなクラスであれ、Objectクラスを継承していないものはないということのようです。
そして、このObjectクラスはjava.langパッケージに含まれる1つらしいです。
java.langパッケージ
javaAPIライブラリには非常に多くのパッケージが用意されていますが、それらを利用するにはimport宣言もしくは完全なクラス名で 呼び出してやらなければいけないようです。
ですが、java.langパッケージはインポート宣言しなくてもコンパイラによって 自動的にimportされます。
⇩ 詳しくは下記サイトへ
・はじめてのJava入門[java.langパッケージ(java.langパッケージとは)]
話がそれましたが、実際に拡張for文をプログラムで確認します。
class sample_test11{ public static void main(String[] args){ // データ型がchar型(基本データ型)の配列を作成 char[] array = {'v','w','x','y','z'}; /* 配列arrayの全要素を順番に取り出し、出力 */ // 拡張for文で処理の場合 for(char c : array){ System.out.print(c + " "); } System.out.println(); //改行 // for文で処理の場合 for(int i = 0; i < array.length; i++){ System.out.print(array[i] + " "); } } }
繰り返し制御文
条件判定がtrueの間、繰り返し処理をしていて、ある特定の条件のときは繰り返しの処理を抜けたいときに繰り返し制御文というものが使われます。
繰り返し制御文は、break文とcontinue文の2種類あるようです。
break文
条件式の判定に関係なく繰り返しを抜けだして、繰り返し文の次の処理に移行します。
break文のイメージ図
実際にプログラムで確認します。
class sample_test12{ public static void main(String[] args){ for(int i=0; i < 8; i++){ if(i == 3){ break; } System.out.println("i =" + i + "回目のfor文の処理"); } System.out.println("break文でfor文を抜けた時に表示されます。"); } }
for文の中にif文があり、i == 3 の時の処理でbreak文が実行されるため、for文の条件式でi < 8とあっても繰り返し処理は強制的に終了し、9行目の処理に移行します。
continue文
break文とは異なり、特定の条件のときに繰り返しを抜けますが、while文、for文などの条件式の判定がtrueの間は、再度、繰り返し文が続行されます。
continueのイメージ図
実際にプログラムで確認します。
class sample_test13 { public static void main(String[] args){ for(int i=0; i < 8; i++){ if((i % 2) = 0){ System.out.println("iが2で割り切れた時に表示されます。"); continue; // 10行目の処理には行かずfor文のi++の処理に移ります。 } System.out.println("i =" + i + "回目のfor文の処理"); } System.out.println("for文が終了した後に処理されます。"); } }
break文とは違い、for文の条件式がtrueの間は処理が繰り返されます。
ラベル
ネスト(入れ子)した繰り返し文で、内側の繰り返し文に記述したbreak文やcontinue文で外側の繰り返し文からも抜けたりスキップすることができるのがラベルというものです。
ラベル名は、識別子の規則に従って任意に指定できるようです。
ラベルのイメージ図
class sample_test14{ public static void main(String[] args){ loop1: for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ System.out.println("i = " + i + ":j =" + j); if(i == 1 && j == 1){ System.out.println("break文の実行"); break loop1; } } } System.out.println("------"); loop2: // ラベルとfor文の間にはコメントなら入れられます /* コメント以外はNG */ for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ System.out.println("i = " + i + ":j =" + j); if(i == 1 && j == 1){ System.out.println("continue文の実行"); continue loop2; } } } } }
今回も詳しくは下記書籍で
次回も続きます、いよいよオブジェクト指向に関した、クラスとオブジェクトの話に突入していきます。是非続きも読んであげてください。
今回はこのへんで。