if文
6.2 if文
条件分岐で一番基本的なパターンとなるのが、if(イフ)文です。これは英語の「if」という単語の意味の通り、「もし○○○ならば、×××する」という条件分岐を作る制御文です。if文は条件に応じて様々な流れを作ることができますが、この節では、最も単純なパターンについて解説していきます。
6.2.1 if文の基本構文
if文の基本構文は下記のようになります。
書式:if基本構文
if( 条件式 ){
処理
}
この場合は、もし条件式が合っていたら(条件を満たしたら)、if文内の処理を行う、ということになります。
◉ポイント・ 条件式を判定した結果は、必ずtrueかfalseのどちらかになる。
プログラムの流れを図にしたものをフローチャートと呼びます。if基本構文の流れを表したフローチャートが図 6.2.1です。
図6.2.1 if基本構文のフローチャート
◉ポイント・ ある条件が成立する時だけ処理を実行する場合、if文を使用します。
6.2.2 関係(比較)演算子とは
条件式を書くためには、関係演算子(比較演算子ともいう)の知識が必要になります。
関係演算子とは、式の左辺と右辺の関係を表す演算子です。
例えば算数では、「1 + 2 = 3」のような式が成立しますが、これは「1+2」と「3」が同じであることを関係演算子「=」で表しているとも言えます。
Javaの世界では、下の表 6.2.1にある関係演算子を使うことが決まっています。
関係演算子 |
使用例 |
意味 |
== |
a==b |
aとbは等ければtrue、それ以外はfalse |
!= |
a!=b |
aとbは等しくなければtrue、それ以外はfalse |
> |
a>b |
aがbより大きいならtrue、それ以外はfalse |
< |
a<b |
aがbより小さいならtrue、それ以外はfalse |
>= |
a>=b |
aがb以上ならtrue、それ以外はfalse |
<= |
a<=b |
aがb以下ならtrue、それ以外はfalse |
前節のif文の条件式に、この関係演算子を当てはめてみましょう。
if( a == b ){
処理
}
この場合は、もしaとbが等しければ(a==bがtrueならば)、処理を行うということになります。
フローチャートで表すと図 6.2.2のようになります。
図6.2.2 if基本構文と関係演算子のフローチャート
文字列の比較 文字列.equals(文字列)
文字列の比較は、関係演算子「==」を使って行なうことはできません。文字列を比較するときには、「==」や「!=」ではなく、「equalsメソッド」を使わなければなりません。
(※Java8以後のバージョンでは文字列比較の際に「==」が使えるようになりました。)
この後、当テキストの6.2.6項で、equalsメソッドを使ったプログラムを作成します。
6.2.3 if文の条件式が成立するプログラム
関係演算子「= =」を使った条件式が成立し、メッセージが表示されることを確認します。
① ソース・フォルダー :myproj_super_intro/src
② パッケージ :jp.co.f1.superintro.ch06
③ 名前 :IfStatement1
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ IfStatement1.java
package jp.co.f1.superintro.ch06; public class IfStatement1 { public static void main(String[] args) { // 比較用の値を管理する変数の宣言と初期化 int a = 5; int b = 5; System.out.println("-- if文開始 --"); if (a == b) { System.out.println("変数aと変数bは等しい。"); } System.out.println("-- if文終了 --"); } }
実行結果
解説
8、9行目ではint型の変数aとbを宣言し、それぞれの変数に同じ値5を代入しています。
13~15行目までがif文です。if文の「{」と「}」で囲まれた範囲は、「ifブロック」という呼び方をします。ifブロック内がインデントされていることを確認して下さい。このように、ブロック内の処理に対してインデントが行われていると、そこに記述されている処理が一目でわかりやすくなります。
ブロック内をインデントすることは、Javaのコーディングの慣例です。
13行目に記述された条件式「a == b」はa=5、b=5と、両方の値が同じなので、条件が満たされます。そのためifブロック内である14行目が実行され、「変数aと変数bは等しい」と表示されます。
図6.2.3 IfStatement1のフローチャート
6.2.4 if文の条件式が成立しないプログラム
次に、条件が満たされない場合(false)を見ていきましょう。
関係演算子「= =」を使った条件式が成立せず、メッセージが出力されないことを確認します。
① ソース・フォルダー :myproj_super_intro/src
② パッケージ :jp.co.f1.superintro.ch06
③ 名前 :IfStatement2
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ IfStatement2.java
package jp.co.f1.superintro.ch06; public class IfStatement2 { public static void main(String[] args) { // 比較用の値を管理する変数の宣言と初期化 int a = 4; int b = 5; System.out.println("-- if文開始 --"); if (a == b) { System.out.println("変数aと変数bは等しい。"); } System.out.println("-- if文終了 --"); } }
実行結果
解説
8行目で、int型の変数aを宣言し、4を代入します。9行目では、int型の変数bを宣言し、5を代入します。
変数aには4、変数bには5が代入されているので、「a == b」、つまり「4 == 5」という条件は成立せず、ifブロック内、つまり14行目は実行されません。
このサンプルプログラムのフローチャートを図 6.2.4に示します。
図6.2.4 IfStatement2のフローチャート
6.2.5 !=演算子を用いた条件式が成立するプログラム
関係演算子「! =」を使った条件式が成立し、メッセージが出力されることを確認します。
① ソース・フォルダー :myproj_super_intro/src
② パッケージ :jp.co.f1.superintro.ch06
③ 名前 :IfStatement3
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ IfStatement3.java
package jp.co.f1.superintro.ch06; public class IfStatement3 { public static void main(String[] args) { // 比較用の値を管理する変数の宣言と初期化 int a = 2; int b = 5; System.out.println("-- if文開始 --"); if (a != b) { System.out.println("変数aと変数bは等しくない。"); } System.out.println("-- if文終了 --"); } }
実行結果
解説
前項のプログラムIfStatement2.javaと比べると、13行目の条件式の記述が変更されています。関係演算子「!=」は、左辺と右辺が等しくない場合にtrueとなります。
変数aには2、変数bには5が代入されています。aとbを比較すると等しくないので、この条件式はtrueとなります。
このサンプルプログラムのフローチャートを図 6.2.5に示します。
図6.2.5 IfStatement3のフローチャート
6.2.6 文字列を比較するequalsメソッドを使ったプログラム
いままでのプログラムでは数値同士を比較してきました。次のプログラムでは、equalsメソッドを使用して、2つの「文字列」を比較する方法を確認してみます。
① ソース・フォルダー :myproj_super_intro/src
② パッケージ :jp.co.f1.superintro.ch06
③ 名前 :EqualsMethod
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ EqualsMethod.java
package jp.co.f1.superintro.ch06; public class EqualsMethod { public static void main(String[] args) { //比較用の文字列を管理する変数の宣言と初期化 String str = "テスト"; System.out.println("-- if文開始 --"); if (str.equals("テスト")) { System.out.println("String型の変数strと文字列\"テスト\"とは意味的に等しい。"); } System.out.println("-- if文終了 --"); } }
実行結果
解説
12行目では、文字列の比較をします。数値型同士では==演算子を使って等しい数値であるかを比較しますが、文字列の比較ではequalsメソッドを使用します。
String型(文字列型)の変数strの値である”テスト”と”テスト”という文字列は意味的に等しいので、条件は満たされます。そのため、13行目が実行されます。
13行目の文字列の中に含まれている「\”」という記述は、エスケープシークエンスと言いいます。これは、文字列を囲う「”(ダブルクォーテーション)」のような特殊な文字を、文字列として表示するために使います。実行結果を見ると、13行目で「String型の変数strと文字列”テスト”とは意味的に等しい。」と、「”」が文字列として表示されています。
このサンプルプログラムのフローチャートは、図 6.2.6に示します。
図6.2.6 EqualsMethodのフローチャート
エスケープシークエンスとはダブルクォーテーション( ” )を表示させたいときは、頭に半角の「 \ 」をつけます。また、そのほかに「 \ 」や「 ‘ 」などを表示させたい場合も、同じように頭に「\」を付けます。このように通常には表現できない特殊文字を、前に「¥」をつけることによって表したものを「エスケープシーケンス」と言います。
表 6.2.2は、エスケープシークエンスの一部を表にまとめたものです。
表示させる文字
記述
\または\
\\
‘(シングルクォーテーション)
\’
“(ダブルクォーテーション)
\”
タブ文字
\t
表 6.2.2 主なエスケープシークエンス一覧