if文(条件分岐)
Java制御構文であるif文は、特定の条件の時だけifの中に記述された処理を行うときに使用します。
if文の構文は次の通りです。
if (条件式) {
// 条件式が一致した時に実行される処理
}
条件に一致しなかったときに実行される処理を記述する場合は、次のようにif 〜 else構文で書きます。
if (条件式){
// 条件式が一致した時に実行される処理
} else {
// 条件不一致の時に実行される処理
}
条件式の書き方
if文の条件式は、結果がtureまたはfalseのboolean型になるようにします。
// 比較演算子で条件式を指定
if (a == b){
// 処理内容
}
// booleanの結果を返すメソッドを条件式を指定
if (file.exists()){
// 処理内容
}
次のような結果を返さないメソッドや、boolean以外の戻り値や計算結果になるものは、if文の条件式に指定できません。(コンパイル時にエラーとなります)
// printlnメソッドは結果を返さないためNG
if (System.out.println("test")){
// 処理内容
}
// substringはboolean以外を返すメソッドのためNG
if (str.substring(1, 3)){
// 処理内容
}
複数の条件式は論理演算子(and・or)を使用
条件が一つではなく複数になる場合は、論理演算子で複数の条件式を繋げます。
論理演算子は、and条件の場合「条件式1&& 条件式2」のようにし、or条件の場合は「条件式1 || 条件式2」のように記述します。
// AND条件
if (a == b && c == d) {
// 処理
}
// OR条件
if (a == b || c == d) {
// 処理
}
and・or条件を組み合わせることも可能です。
// AND・OR条件の組み合わせ
if ( a == b && c == d && (e == f || g == h) ) {
// 処理
}
ネストしたif文
ネストとは、処理の中にさらに制御文を含めた入れ子になった状態のことを言います。
if文についても、次のようにネストさせることができます。
if (a >= 100) {
b = a * 2;
if (b >= 400) {
System.out.println(b);
}
}
また、繰り替えし処理ブロックの中で、if文の制御ブロックをネストさせて、特定の条件の時のみ処理を実行させたりもします。
次のコードは、変数iが1〜10までの数値の間、繰り返し処理を行い、iが偶数の時だけコンソール出力を行う例です。
for (int i = 1; i < 10; i++) {
if (i % 2 == 0) {
System.out.println(i + "は偶数です");
}
}
【実行結果】
------------------------
2は偶数です
4は偶数です
6は偶数です
8は偶数です
10は偶数です
複雑にネストしたif文は保守性を低下させる
前述のように、if文をネストさせたり、他の制御構文と組み合わせて使うことで、より複雑な条件での処理を行えます。
しかし、あまりに深く処理をネストするとコードの保守性を低下させます。
次のコードは、メソッドに渡ってきた引数の内容をifをネストしそれぞれチェックし、すべての引数の値が正常の範囲内であれば、本当にやりたり処理を実行しています。
public void sampleMethod(int a1, int a2, int a3, int a4) {
if (a1 >= 1 && a1 <= 100) {
if (a2 == 1 || a2 == 3) {
System.out.println("a1とa2が正常な値の時に実行する処理");
if (a3 >= 0 && a3 <= 10) {
if (a4 != -1) {
System.out.println("すべて引数が正常な時に実行したい処理");
}
}
}
}
}
上のコードを見れば分かると思いますが、if文などのコードブロックが深くネストした処理は、非常に見にくいためコードの保守性を低下させ、今後メソッドの引数が増えた場合、さらにif文のネストが深くなることでしょう。
このような場合、早期リターン(アーリー・リターン)を使って、引数のチェックでエラーが発生した時点で、メソッドの処理を抜けてしまうことで、コードがシンプルになり保守しやすくなります。
public void sampleMethod(int a1, int a2, int a3, int a4) {
if (a1 < 1 || a1 > 100) {
return;
}
if (a2 != 1 && a2 != 3) {
return;
}
System.out.println("a1とa2が正常な値の時に実行する処理");
if (a3 < 0 && a3 > 10) {
return;
}
if (a4 == -1) {
return;
}
System.out.println("すべて引数が正常な時に実行したい処理");
}
このように、if文の数は減ってはいませんが、早期リターン(アーリー・リターン)を使ってチェックエラーになった時点で処理を抜けることで、if文のネストがなくなりコードがすっきりしたと思います。
三項演算子でif文を省略
三項演算子とは、if文を省略した条件分岐によって値を返す構文です。
三項演算子は条件演算子とも呼ばれます。
使い方は次の構文の通りで、条件式の値がtrueだった時に式1の結果を返し、falseだった場合に式2の結果を返します。
条件式 ? 式1 : 式2
条件式はif文と同様に、結果がtureまたはfalseのboolean型となる条件式で指定し、複数の条件式を指定する場合は&&(AND)や||(OR)の論理演算子で条件を繋げます。
if文と異なる点は、三項演算子の式1と式2は値を返す必要があり、さらに式1と式2の戻り値の型も合わせる必要があります。
また、ifのようにコードブロック(複数行の命令)は実行できません。
三項演算子の使用例
それでは三項演算子を使ったサンプルコードを見てみましょう。
次の例は、年齢が20歳以上の場合は”成人”、20歳未満の場合は”未成年”の文字列を返す三項演算子です。
public class Main {
public static void main(String[] args) throws Exception {
int age = 20;
String ret = age >= 20 ? "成人" : "未成年"; // 三項演算子を使用して成人か未成年か判定
System.out.println("結果=" + ret); // 結果を表示
}
}
&&(AND)や||(OR)の論理演算子で複数の条件を指定する場合は次のようにします。
// AND条件
a == b && c == d ? 式1 : 式2
// OR条件
a == b || c == d ? 式1 : 式2
さいごに
Javaのif文の使い方や、&&(AND条件)・OR(OR条件)で複数の条件を繋げる方法などを紹介してきました。
ifは非常によく使う制御構文で、ネストしすぎたりするとコードの可読性が悪くなるため、使い方を覚えるとともに、作成したコードが後から読みやすいifの使い方を心がけるようにしましょう。
【関連記事】
▶【Java】初心者必見!if文の使い方を完全解説!
if文でAND・OR条件を組み合わせる場合は、上記コード例の通りor条件の部分を括弧で囲むようにする必要があります。
括弧で囲わず条件1 && 条件2 || 条件3のようにしてしまうと、条件3が一致した時点で判定結果がtrueとなるため、意図しない結果となることがあります。