5. 制御構文
処理によっては、特定の条件の場合のみ行わなければならない処理や、繰り返し行わなければならない処理など、処理の制御が必要になることがあります。ここではif文とswitch文による条件分岐とfor文とwhile文による繰り返しの処理について見ていきます。
5.1. if文
if文は条件によって処理を分岐させたい場合に使われる構文です。if文は「()」内の条件を評価し、その条件がtrueなら、その条件に定義されている処理のみを実行します。また、if文では「else if」を使うことにより複数の条件分岐を行うことができ、「else」はif文やelse if文のすべての条件に当てはまらない場合に処理が実行されるものです。if文の基本的な書式は次になります。
if ( 条件1 ) {
……処理1
} else if ( 条件2 ){
……処理2
} else {
……処理3
}
この構文の流れはifの条件1がtrueの場合に処理1のみを実行します。もし条件1がfalseの場合は次のelse ifの条件2を判定し、結果がtrueなら処理2のみを実行します。もし、どの条件にも当てはまらない場合はelseのブロックに記述されている処理3が実行されます。
また、指定した条件が条件1にも条件2にも複数当てはまる場合、先に定義してある条件1の処理1のみ実行します。
また、「else if」の箇所と「else」の箇所は省略が可能で、省略された場合は「if」での条件がtrueの場合のみ、その条件の処理を行い、条件に合わなければif文で定義してある処理に関して何もしないことになります。
それでは、次のif文のサンプルを実行してみましょう。このサンプルでは実行時にコマンドライン引数を渡します。引数を渡さないと例外が発生するので注意してください。
package jp.codezine.java.sample03;
/**
* if文のサンプルを実行し、その内容を確認するクラス。
*/
public class IfStatement {
/**
* if文を実行し、その内容を確認します。
*
* @param args
* int値に変換する文字列が指定されているコマンドライン引数。
*/
public static void main(String[] args) {
// 引数の文字列を int 値に変換
int value = Integer.valueOf(args[0]);
// [1] if文
if (value == 0) {
System.out.println("[1] value は 0");
} else if (value == 1) {
System.out.println("[1] value は 1");
} else {
System.out.println("[1] value は 0 でも 1 でもない");
}
}
}
実行結果はコマンドライン引数の値によって変わってきます。それぞれの実行結果は次のものになります。
[1] value は 0
[1] value は 1
[1] value は 0 でも 1 でもない
Eclipseでのコマンドライン引数を入力の仕方
Eclipseからコマンドライン引数を入力して実行するには次の手順で行います。




5.2.switch文
Javaの条件分岐の構文はif文だけでなくswitch文もあります。switch文の基本的な書式は次になります。
switch ( 評価値 ) {
case 値1:
……処理1
break;
case 値2:
……処理2
break;
default:
……処理3
}
このswitch文は評価値と同じ値がcaseの値にあると、そのcaseに記述されている処理を実行します。もし、該当するcaseがない場合はdefaultでの処理(処理3)が実行されます。例えば評価値が値1と同じ場合、処理1が実行されbreak文でswitch文の処理を終了します。また、評価値が値1とも値2とも同じでない場合はdefaultの処理(処理3)が実行されます。
評価値に使えるデータの型はbyte、char、byte、short、int、enumになります。またJava 7以降はStringも使えるようになっています。
また、switch文ではcaseごとの処理の最後に「break;」を記述します。これはswitch文ではcaseの処理にbreakがない場合、そのcaseでの処理を実行し終えてもcaseから出ずに、評価値とまったく違う次のcaseの処理も行ってしまうためです。その性質を利用したプログラミングをする可能性もあるのですが、単にbreak文を忘れたのかが分かりづらくなるので、そのような使い方をする場合は十分注意してください。
それではまず、breakをつけたサンプルを見てみましょう。
package jp.codezine.java.sample03;
/**
* switch文のサンプルを実行し、その内容を確認するクラス。
*/
public class SwitchStatement1 {
/**
* switch文を実行し、その内容を確認します。
*
* @param args
* コマンドライン引数。今回は使われません。
*/
public static void main(String[] args) {
// 引数の文字列を int 値に変換
int value = Integer.valueOf(args[0]);
// [1] switch文
System.out.println("■ [1] switch文 -------");
switch (value) {
case 0:
System.out.println("[1] value は 0");
break;
case 1:
System.out.println("[1] value は 1");
break;
default:
System.out.println("[1] value は 0 でも 1 でもない");
}
}
}
実行結果はコマンドライン引数の値によって変わってきます。それぞれの実行結果は次のものになります。
[1] value は 0
[1] value は 1
[1] value は 0 でも 1 でもない
次にbreakが入っていないサンプルを実行してみましょう。ここではコマンドライン引数に「0」を渡します。
package jp.codezine.java.sample03;
/**
* switch文のサンプルを実行し、その内容を確認するクラス。
*/
public class SwitchStatement2 {
/**
* switch文を実行し、その内容を確認します。
*
* @param args
* コマンドライン引数。今回は使われません。
*/
public static void main(String[] args) {
// 引数の文字列を int 値に変換
int value = Integer.valueOf(args[0]);
// [1] switch文
switch (value) {
case 0:
System.out.println("[1] value は 0");
case 1:
System.out.println("[1] value は 1");
default:
System.out.println("[1] value は 0 でも 1 でもない");
}
}
}
[1] value は 0 [1] value は 1 [1] value は 0 でも 1 でもない
このように、switch文にbreakがない場合、該当のcaseで終わらず、それ以降の条件とマッチしないcase文まで、break文が出てくるか、switch文が終了するまで、実行してしまいます。
5.3. for文
Javaで繰り返しの処理する場合、for文を使って繰り返しの処理を行うことができます。for文の書式は次のようになっています。
for ( カウンタの初期化; 条件; カウンタの増減 ){
……処理
}
慣例的な例としてループ時のカウンタの変数名を「i」とし、次のように定義します。これは毎回iが1加算され、iが最大値になるまでfor文内の処理を行うことを意味しています。
for (int i = 0; i <= 最大値; i++) {
……
}
ここでは最初に右側「int i = 0」で変数であるiに初期値の0を設定しています。次に真ん中の「i <= 最大値」で変数iが最大値以下の場合と条件を設定しています。この条件がtrueの場合、for文の中に記述されている処理が実行されます。その処理が終わると、次に右の「i++」でカウンタである変数iを1増加します。その後、真ん中の条件から判定してtrueの場合は同じように処理を行い、falseの場合はfor文の処理を終了します。
ちなみに、この変数「i」は定義されたfor文内のみ有効で、for文を抜けた後にはこの変数は使われなくなります。またfor文の外にすでに変数「i」が定義されている場合は、この変数名は使えないので注意してください。
また、カウンタを使わずに、配列やCollectionのクラスなどの集合体に対してすべての要素を1つずつループ内で取得する場合にもfor文を使うことが可能です。その場合の書式は「拡張for文」と呼ばれ、次のようになります。
for ( 要素 : 集合体 ) {
……処理
}
それでは次のサンプルを実行してみましょう。
package jp.codezine.java.sample03;
/**
* for文のサンプルを実行し、その内容を確認するクラス。
*/
public class ForStatement {
/**
* for文を実行し、その内容を確認します。
*
* @param args
* コマンドライン引数。今回は使われません。
*/
public static void main(String[] args) {
// [1] for文
System.out.println("------- カウンタでのサンプル -------");
String stringValue = "あいうえお";
for (int i = 0; i < stringValue.length(); i++) {
System.out.println("[1] " + stringValue.charAt(i));
}
System.out.println("------- 配列でのサンプル -------");
char[] chars = stringValue.toCharArray();
for (char charValue : chars) {
System.out.println("[2] " + charValue);
}
}
}
------- カウンタでのサンプル ------- [1] あ [1] い [1] う [1] え [1] お ------- 配列でのサンプル ------- [2] あ [2] い [2] う [2] え [2] お
5.4. while文とdo-while文
またfor文のほかにも繰り返し処理をする構文の一つにwhile文があります。while文の書式は次のようになります。
while ( 条件 ) {
……処理
}
while文は、条件がtrueの間もしくは処理でbreakやreturnが呼ばれるまで、繰り返しの処理が行われます。
また、while文とよく似た構文にdo-while文があります。do-while文の書式は次のようになります。
do {
……処理
} while ( 条件 )
このdo-while文とwhile文の違いはdo-while文の条件の判定はdoの処理を行った後にされる点です。例えば次のようなwhile文とdo-while文のサンプルがあった場合、
// while文
int value = 0;
while (value < 0) {
……処理
}
// do-while文
value = 0;
do {
……処理
} while (value < 0);
while文は判定が最初からfalseなので処理が実行されませんが、do-while文では最初にdoの処理が実行されます。
それではサンプルを実行してみましょう。
package jp.codezine.java.sample03;
/**
* while文およびdo-while文のサンプルを実行し、その内容を確認するクラス。
*/
public class WhileStatement {
/**
* while文およびdo-while文を実行し、その内容を確認します。
*
* @param args
* コマンドライン引数。今回は使われません。
*/
public static void main(String[] args) {
// [1] while文
System.out.println("------- [1] while文 -------");
int value = 0;
while (value < 3) {
System.out.println("value は " + value);
value++;
}
// [2] do-while文
System.out.println("------- [2] do-while文 -------");
value = 0;
do {
System.out.println("value は " + value);
value++;
} while (value < 3);
// [3] 条件に一つもマッチしないwhile文
System.out.println("------- [3] 条件に一つもマッチしないwhile文 -------");
value = 0;
while (value < 0) {
System.out.println("value は " + value);
value++;
}
// [4] 条件に一つもマッチしないdo-while文
System.out.println("------- [4] 条件に一つもマッチしないdo-while文 -------");
value = 0;
do {
System.out.println("value は " + value);
value++;
} while (value < 0);
}
}
------- [1] while文 ------- value は 0 value は 1 value は 2 ------- [2] do-while文 ------- value は 0 value は 1 value は 2 ------- [3] 条件に一つもマッチしないwhile文 ------- ------- [4] 条件に一つもマッチしないdo-while文 ------- value は 0
