次に、条件が成立するときと成立しないときとで処理を分けたい場合のプログラミング方法について解説します。この場合は、もう1つのif文であるif-then-else文を使います。if-then-else文は次のように記述します。条件が成立するときは文1が実行され、成立しないときは文2が実行されます。
if (条件式) 文1 else 文2
これも直感的に処理の流れを理解できるように図で表してみると、図2のようになります。図では、前処理の後に条件式の判定をして、条件式が真の場合は処理1を実行してから処理3を実行しますが、条件式が偽の場合は処理2を実行してから処理3を実行するという処理の流れを示しています。このうち赤線で囲んだ部分がif-then-else文と対応することになります。
ここで、if文自体も文なので、次のように文2としてif-then文やif-then-else文を記述することもできます。このようにすることで、複数の条件を設定して処理の流れを細かく制御することも可能になります。
if (条件式1) 文1 else if (条件式2) 文2
if (条件式1) 文1 else if (条件式2) 文2 else 文3
if文を1行で記述すると処理の流れが分かりにくいので、普通は段落(インデント)を付けます。どのようにするかというのは実際に見た方が早いでしょう。下記のように文を字下げするのです。この字下げを簡単にする方法があります。Eclipseのソースコードフォーマット機能を活用すればよいのです。この機能を利用するときの具体的な手順はサンプルプログラムを作成するときに一緒に説明します。このようにインデントを付けることにより、各条件式によってどのように処理が分岐されているかが分かりやすくなります。
if (条件式1)
文1
else if (条件式2)
文2
else
文3
if-then-else文のサンプルに入る前に、評価結果がboolean値になる演算子である関係演算子と等値演算子について解説をしておきます。
x ≧ 5000 というような式をJavaで表現するためには、関係演算子を使います。関係演算子のうち、数値を比較するのに使用する数値比較演算子の一覧を表1に示します。≧といった比較は>といった不等号と等号(=)とを組み合わせて記述する点に注意しましょう。
注意 instanceof比較演算子
関係演算子には、instanceof比較演算子という参照型の比較をするための演算子もありますが、この時点では数値比較演算子だけを理解しておけばよいので解説をしていません。これはオブジェクトの型が一致しているかを比較する演算子なので、クラスとオブジェクトについて解説をした後に説明する予定です。
等しいとか等しくないという関係を表現するためには、等値演算子を使います。等値演算子のうち、数値を比較するのには数値等値演算子を使い、trueやfalseといった真偽値を比較するのには真偽等値演算子を使います。数値等値演算子、真偽等値演算子の一覧を表2に示します。数学では等値は=であり非等値は≠ですが、Javaではそれぞれ==と!=と記述します。
数値等値演算子と真偽等値演算子の記号は同じですが微妙な違いがあります。a、b、cがboolean型変数のときには、(a==b)==cという条件式を記述すると==は真偽等値演算子となりコンパイル可能です。ところが、a、b、cがint型変数のときに(a==b)==cという条件式を記述すると==は数値等値演算子となりコンパイルすることができなくなります。コンパイルエラーになるのは(a==b)の演算結果がboolean値となるのに対しcはint型なので、(a==b)の演算結果の型とcの型が一致しないことが理由です。(a==b)==cのような条件式を指定したい場合は、(a==b) && (b==c)のように論理演算子を組み合わせます。
注意 参照等値演算子
等値演算子には、参照等値演算子というオブジェクトの等値性判定をするための演算子もありますが、この時点では数値等値演算子と真偽等値演算子だけを理解しておけばよいので解説をしていません。これもinstanceof比較演算子と同様にクラスとオブジェクトについて解説をした後に説明する予定です。
それでは、単純なサンプルプログラムを動作させてみましょう。if-then文サンプルプログラムを作成したときと同様にしてSample41クラスを作成し、リスト2の水色部分を追加してください。
最初のif文では条件式がtrueなのでSystem.out.println(true);が実行されます。次のif文ではxが1のときは条件式(x<3)がtrueなのでSystem.out.println(true); が実行されます。3つ目のif文ではxが1のときは条件式(x>=3)がfalseなので、この場合はelse以降の文が実行されます。ここでは、そこにまたif文がありxが1のときは条件式(0<x && x<2)がtrueなので、{ System.out.println(false); System.out.println(true); }のブロックが実行されます。ブロックの中では、条件式(x>=3)の判定結果と条件式(0<x && x<2)の判定結果を順に表示する処理を記述してある点に注意しましょう。これらのことから、実行結果は画面2のようになります。
true
true
false
true
次に確認のために、if (true)の部分をif (false)と変更し、x = 1の部分をx = 2と変更してみましょう。ただし、リスト2のままではif文による処理の流れが一目では分かりにくいので、Eclipseのソースコードフォーマット機能を活用して見た目を整えます。Sample41のソースコードを表示しながら、メニューで[ソース]→[フォーマット]を指定して実行するとリスト3のように整形できます。
最初のif文では条件式がfalseなのでSystem.out.println(false);が実行されます。次のif文ではxが2のときは条件式(x<3)がtrueなのでSystem.out.println(true); が実行されます。3つ目のif文ではxが1のときは条件式(x>=3)がfalseなので、この場合はelse以降の文が実行されます。ここでは、そこにまたif文がありxが2のときは条件式(0<x && x<2)がfalseなので、{ System.out.println(false); System.out.println(false); }のブロックが実行されます。これらのことから、実行結果は画面3のようになります。
false
true
false
false
このほか、xの値を負の値にしたり、3より大きい値にしたりして実行してみると、さらに理解が深まると思います。興味のある読者は試してみてください。
図3のような処理はif-then-else文でも表現可能ですが、変数の値によって処理を複数に分岐したい場合にはswitch文を使うとコンパクトに記述できる場合があります。
switch文の書き方を説明する前に、図3の処理の流れをif-then-else文とswitch文で実現した場合を比較してみましょう(表3)。if-then-else文では比較している変数がxかどうかを全部の条件式を確認しないと分かりませんが、switch文ではそれが一目で分かります。switch文ではx==0というような式をたくさん書かなくてもいいというのもうれしい点です。
それではswitch文の書き方を見てみましょう。switch文は次のように記述するのが基本です。ただし、式には評価結果が整数値となるものしか使えません。式の結果がcaseで指定した値に一致する場合には、その値に対応するcaseに行き、そこで文が実行されます。式の結果と一致する値がcaseで指定されていない場合はdefaultに行き、文3が実行されます。break文はswitch文を抜け出すという命令です。break文がないとswitch文を抜け出さないので、処理が次の行へ流れて行くことに注意しましょう。例えば、「case 値2:」の直前にあるbreak文を削除すると、プログラム実行時に式の評価結果が値1となると文1と文2が実行されてしまいます。
前処理文
switch (式) {
case 値1:
文1
break;
case 値2:
文2
break;
default:
文3
}
コラム 評価結果が整数値となる式
正確には評価結果がchar、byte、short、int型となる式です。byte、short型は整数値を表す型で、表現できる値の範囲がint型よりも狭くなっています。char型は文字と対応する文字コードの整数値を保持するための型なので、評価結果が整数値となります。ただし、int型よりも大きな整数値を表現できるlong型は使えないので注意しましょう。
それでは、単純なサンプルプログラムを動作させてみましょう。if-then文サンプルプログラムを作成したときと同様にしてSample42クラスを作成し、リスト4の水色部分を追加してください。
このプログラムを実行するとxの値が1なので、「case 1 :」に行き、System.out.println(1);が実行されて1が出力されます。xの値を5にすると、「default :」に行き、System.out.println(-1); が実行されて-1が出力されます。さらに、xの値を0、2、3と変更して実行して動作を確認してみるとよいでしょう。
今回は、場合によって処理を変えるプログラムを作成するのに必要な条件分岐処理の記述方法について解説しました。基本的にはif文を使用すればよいということと場合によってはswitch文を使用するとすっきりした記述ができるということの2点を理解できたでしょうか。また、書いた順に処理を実行するだけでなく、if文やswitch文を使えば処理の流れを制御(コントロール)できるということも理解できたでしょうか。そうそう、Eclipseのソースコードをフォーマットする機能も重宝するはずです。活用してください。
処理の流れを制御できるようになると、プログラムにいろいろな動作をさせることができるようになるので、プログラミングをする楽しみが増えます。今回の解説で、ある程度プログラムの処理の流れを制御できるようになりましたが、完全に処理を制御するためには繰り返し処理という制御も必要です。そこで、次回は繰り返し処理について解説する予定です。
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。Ja-Jakartaプロジェクト(http://www.jajakarta.org/)へ参加し、PMCの一員として活動を支えている。また、長野県の地域コミュニティである、SSS(G)(http://www.sssg.org/)やbugs(J)(http://www.bugs.jp/)の活動へも参加している。
Copyright © ITmedia, Inc. All Rights Reserved.