こんにちは!フリーランスの長野です。
普段の生活の中でもどちらかの選択によって行動が変わってくることってありますよね。例えば、歩行者信号が青信号の場合は横断歩道を渡る。赤信号の場合は止まるなどです。
Javaのプログラミングでも条件によって、処理を変えなければならない場合はよくあります。そんな場合に使用するのがif文です。
この記事では、Javaのif文について
- if文とは
- if else文で条件が複数の場合の記述方法
という基本的な文の構造の説明から、
- 論理演算子(OR・AND・NOT)の使い方
- 比較演算子(等号・不等号)の使い
- if else文を三項演算子で1行に省略する方法
- if文のbreakやcontinueでループを制御する方法
などの条件を判断する方法についても解説していきます。
今回はif文について、使い方をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
if文とは
if文は主に、2つの値の大小関係や、等しい・等しくないなどの条件により処理を変える場合に使われます。
大小関係や、等しい・等しくないなどの条件式が「true」の場合に{ }内の処理を行い、「false」の場合にはif文のブロック外に出るかもしくは「else」句の後の{ }内の処理を行います。
それに対して、switch文も条件によって処理を変える場合に使われますが、switch文の場合はたくさんの条件に分かれる場合に使われます。
例えば、サイコロの目は1から6までありますが、1から6までの出た目でそれぞれ処理が違う場合などです。2者の関係によって処理を変えるif文の使い方について、サンプルコードをみながら詳しく解説していきます。
if else文で条件が複数の場合の記述方法
if else文で複数の条件で処理を分ける場合についてみていきます。
条件とは一致しないそれ以外の場合を記述するときに「else」句を使用します。
if else文の基本的な使い方
下記のサンプルコードでは、4年に一度の「うるう年」かどうかの判定をしています。
public class Main { public static void main(String[] args) { int year; // うるう年の場合 year = 2016; // 結果表示の処理 if (year % 4 == 0) { System.out.println(year + "年は、うるう年です!"); } else { System.out.println(year + "年は、うるう年ではありません!"); } // うるう年でない場合 year = 2017; // 結果表示の処理 if (year % 4 == 0) { System.out.println(year + "年は、うるう年です!"); } else { System.out.println(year + "年は、うるう年ではありません!"); } } }
実行結果:
2016年は、うるう年です! 2017年は、うるう年ではありません!
このサンプルコードでは、西暦年数が4で割り切れる場合は「うるう年です」と、それ以外の場合は「うるう年ではありません」と表示します。
処理が1行の場合の{}の省略
if文の処理が1行の場合は、{}を省略して記述することができます。
先ほどの例も処理が1行ですので、以下のように省略して記述しても問題ありません。
public class Main { public static void main(String[] args) { int year; // うるう年の場合 year = 2016; // 結果表示の処理 if (year % 4 == 0) System.out.println(year + "年は、うるう年です!"); else System.out.println(year + "年は、うるう年ではありません!"); // うるう年でない場合 year = 2017; // 結果表示の処理 if (year % 4 == 0) System.out.println(year + "年は、うるう年です!"); else System.out.println(year + "年は、うるう年ではありません!"); } }
実行結果:
2016年は、うるう年です! 2017年は、うるう年ではありません!
if文の入れ子(ネスト)の使い方
if文の条件の中で、さらに条件を追加したい場合ってありますよね。これをif文の入れ子(ネスト)と言いますが、その記述方法についてみていきます。
先ほどの例に修正を加えます。「うるう年」と言えば、夏季オリンピックの開催年ですよね。
そしてオリンピックは冬季も開催されます。以下のサンプルコードでは、西暦年数でオリンピックの開催年かどうかの判断を追加しています。
public class Main { public static void main(String[] args) { int year; // うるう年の場合 year = 2016; // 結果表示の処理 if (year % 4 == 0) { System.out.println(year + "年はうるう年で、夏季オリンピック開催年です!"); } else { // 入れ子(ネスト) if (year % 4 == 2){ System.out.println(year + "年はうるう年ではありませんが、冬季オリンピックの開催年です!"); } else { System.out.println(year + "年はうるう年ではありませし、オリンピックも開催されません!"); } } // うるう年でなく、オリンピック開催年でもない場合 year = 2017; // 結果表示の処理 if (year % 4 == 0) { System.out.println(year + "年はうるう年で、夏季オリンピック開催年です!"); } else { // 入れ子(ネスト) if (year % 4 == 2){ System.out.println(year + "年はうるう年ではありませんが、冬季オリンピックの開催年です!"); } else { System.out.println(year + "年はうるう年ではありませし、オリンピックも開催されません!"); } } // うるう年でなく、オリンピック開催年でもない場合 year = 2018; // 結果表示の処理 if (year % 4 == 0) { System.out.println(year + "年はうるう年で、夏季オリンピック開催年です!"); } else { // 入れ子(ネスト) if (year % 4 == 2){ System.out.println(year + "年はうるう年ではありませんが、冬季オリンピックの開催年です!"); } else { System.out.println(year + "年はうるう年ではありませし、オリンピックも開催されません!"); } } } }
実行結果:
2016年はうるう年で、夏季オリンピック開催年です! 2017年はうるう年ではありませし、オリンピックも開催されません! 2018年はうるう年ではありませんが、冬季オリンピックの開催年です!
論理演算子(OR・AND・NOT)の使い方
if文の条件式が2つ以上ある場合について、みていきましょう。
条件式が2つ以上ある場合は、「OR」や「AND」といった論理演算子を使います。論理演算子には、次のようなモノがあります。
論理演算子の種類 | 書き方例 | 説明 |
---|---|---|
OR | A || B | AもしくはBのどちらか一方が「true」であれば、「true」の値を返す。 A、Bどちらとも「false」の場合のみ、「false」の値を返す。 |
AND | A && B | A、Bどちらとも「true」の場合のみ、「true」の値を返す。 AもしくはBのどちらか一方が「false」であれば、「false」の値を返す。 |
NOT | !A | Aが「true」の場合「false」の値を返す。 「false」の場合「true」の値を返す。 |
それでは、実際の使い方をサンプルコードでみていきましょう。
public class Main { public static void main(String[] args) { int year; // うるう年の場合 year = 2016; // 結果表示の処理 if ((year % 4 == 0) || (year % 4 == 2)) { // 「OR」の例 System.out.println(year + "年は、夏季もしくは冬季のオリンピック開催年です!"); } else if (!(year % 4 == 0) && !(year % 4 == 2)) { // 「NOT」と「AND」の例 System.out.println(year + "年は、オリンピック開催年ではありません!"); } else { // 処理は何もしない場合もエラーにはならない } // うるう年でなく、オリンピック開催年でもない場合 year = 2017; // 結果表示の処理 if ((year % 4 == 0) || (year % 4 == 2)) { // 「OR」の例 System.out.println(year + "年は、夏季もしくは冬季のオリンピック開催年です!"); } else if (!(year % 4 == 0) && !(year % 4 == 2)) { // 「NOT」と「AND」の例 System.out.println(year + "年は、オリンピック開催年ではありません!"); } else { // 処理は何もしない } } }
実行結果:
2016年は、夏季もしくは冬季のオリンピック開催年です! 2017年は、オリンピック開催年ではありません!
このサンプルコードでは、まず西暦年数が4で割り切れるか、もしくは余りが2の場合にオリンピック開催年かどうか判断しています。「||」記号を使って2つの条件のどちらか一方を満たすか「OR」の判定を行っています。
次にオリンピック開催年でない場合の判断をするために、「!」記号を使って西暦年数が4で割り切れない、余りが2でないという「NOT」の判定を行っています。
さらに「&&」記号を使って2つの条件を共に満たすか「AND」の判定を行っています。
なお、「else」句の後には処理は何も記述していません。これでも問題になることはありません。
比較演算子(等号・不等号)の使い方
if文の条件式で必要になってくるのが、関係演算子です。
関係演算子は2つの値を比較します。比較とは、どちらの値が大きいか小さいか、等しいか等しくないか、など二者を比べることです。
関係演算子の例をまとめました。
書き方例 | 説明 | |
---|---|---|
不等号 | val1 < val2 | va1はval2より小さい |
val1 <= val2 | vai1はval2以下 | |
val1 > val2 | val1はval2より大きい | |
val1 >= val2 | val1はval2以上 | |
等号 | val1 == val2 | val1はval2と等しい |
val1 != val2 | val1はval2と等しくない | |
instanceof | val1 instaceof val2 | val1はval2クラスのインスタンスかどうか (val2はインターフェースや配列などの場合も含む) |
これらが関係演算子と呼ばれるモノになります。比較が正しければ「true」を返し、間違っていれば「false」を返します。
等号・不等号については、よく見かけるかもしれません。instanceofについては、あまり見かける機会は少ないのかもしれません。
等号・不等とinstanceofとに分けて、順にサンプルコードをみていきます。
比較演算子(等号・不等号)の使い方
等号・不等号について、サンプルコードをみていきましょう。
オリンピックではスケートやサッカーのように競技連盟のルールにより、出場に年齢制限があります。それを例として、みていきましょう。
なお、等号のサンプルについては、前述のオリンピック開催年かどうかの判定を参考にしてくださいね。
public class Main { public static void main(String[] args) { int age; // スケートの年齢制限は15歳以上 int limitLow = 15; // サッカーの年齢制限は23歳以下 int limitHigh = 23; // 14歳の場合 age = 14; // 結果表示の処理 if (age < limitLow) { System.out.println(age + "歳ではスケートは出場できません"); } // 15歳の場合 age = 15; // 結果表示の処理 if (age >= limitLow) { System.out.println(age + "歳ではスケートは出場できます"); } // 23歳の場合 age = 23; // 結果表示の処理 if (age <= limitHigh) { System.out.println(age + "歳ではサッカーは出場できます"); } // 24歳の場合 age = 24; // 結果表示の処理 if (age > limitHigh) { System.out.println(age + "歳ではサッカーは出場できません"); } } }
実行結果:
14歳ではスケートは出場できません 15歳ではスケートは出場できます 23歳ではサッカーは出場できます 24歳ではサッカーは出場できません
instanceof演算子の使い方
instanceofは「new」句でインスタンス化されたオブジェクトの型を判定する演算子です。
インスタンス化されたオブジェクトと生成元のクラスや配列とが一致するかどうかを判定する場合に使います。instanceofの使い方について、サンプルコードをみていきましょう。
public class Main { public static void main(String[] args) { // クラスのインスタンス生成 Integer num = new Integer(1); // 配列の生成 int row[] = new int[3]; // Integerクラスのインスタンスか否かの比較 if (num instanceof Integer) { System.out.println("num はIntegerクラスのインスタンスです"); } // int型配列か否かの比較 if (row instanceof int[]) { System.out.println("row はint型の配列です"); } } }
実行結果:
num はIntegerクラスのインスタンスです row はint型の配列です
instanceof演算子の詳しい使い方はこちらの記事で詳しく解説しているので、ぜひ確認してください。
if-else文を三項演算子で1行に省略する方法
三項演算子を使うと、if-else文を1行に省略することができます。
三項演算子の使い方を次のプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { String str = "abc"; String result = (str == "abc") ? "Samurai" : "Engineer"; System.out.println(result); } }
実行結果:
Samurai
このプログラムでは、条件式が「true(真)」のため左側の「Samurai」を返しています。
三項演算子の詳しい使い方はこちらの記事で詳しく解説しているので、ぜひ確認してください。
if文のbreakやcontinueでループを制御
if文中の「break」句や「continue」句を使ってfor文のループを制御することができます。
詳しい使い方ははこちらの記事をを参考にしてください。
まとめ
ここでは、if文・if else文の使い方、論理演算子の使い方、関係演算子の使い方について説明しました。条件分けが必要な複雑な処理をするためには、if文を頻繁に使うことになるでしょう。
そんなときに条件や判定が複雑になりどのように記述してよいか、わからなくなる場合もあるかもしれません。
そんな場合はこの記事を何度も参考にして下さいね!