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