Javaを用いたプログラミングにおいて、プログラムの流れを制御する「制御構文」は欠かせない要素です。

その中でも最も基本的かつ頻繁に使用されるのがif文です。

if文を使いこなすことで、特定の条件を満たしたときのみ処理を実行したり、条件に応じて異なる処理へ分岐させたりすることが可能になります。

本記事では、Javaのif文の基本的な書き方から、演算子を用いた複雑な条件分岐、さらには実務で役立つ応用テクニックまでを詳しく解説します。

初心者の方はもちろん、基礎を再確認したい方もぜひ参考にしてください。

Javaのif文とは

if文は、日本語で「もし~ならば」という意味を持つ通り、条件式の評価結果(真偽値)に基づいて実行する処理を切り替えるための構文です。

Javaのような静的型付け言語では、条件式の結果は必ず boolean 型(true または false)である必要があります。

条件分岐の重要性

プログラムは通常、上から下へと順番に実行されますが、実際のアプリケーション開発では「ユーザーがログインしている場合のみマイページを表示する」「在庫が0の場合は購入ボタンを無効化する」といった、状況に応じた判断が必要になります。

if文を適切に記述することは、プログラムにインテリジェンスな振る舞いを持たせる第一歩と言えるでしょう。

if文の基本構文

Javaにおけるif文の最もシンプルな形は、一つの条件を判定するものです。

条件が満たされた(true)場合にのみ、続くブロック内の処理が実行されます。

基本的な書き方

Java
public class BasicIf {
    public static void main(String[] args) {
        int score = 85;

        // scoreが80以上の場合にメッセージを表示
        if (score >= 80) {
            System.out.println("合格です!おめでとうございます。");
        }
    }
}
実行結果
合格です!おめでとうございます。

上記の例では、変数 score が80以上であるかどうかを判定しています。

条件式 score >= 80true となるため、波括弧 {} 内の処理が実行されます。

もし score が70であった場合、何も表示されずにプログラムは終了します。

else句による「そうでなければ」の処理

条件が満たされなかった(false)場合の処理を記述するには、else 句を使用します。

これにより、二者択一の処理を表現できます。

Java
public class ElseExample {
    public static void main(String[] args) {
        int age = 18;

        if (age >= 20) {
            System.out.println("お酒を購入できます。");
        } else {
            System.out.println("未成年の方は、お酒を購入できません。");
        }
    }
}
実行結果
未成年の方は、お酒を購入できません。

else if句による多方向分岐

複数の条件を順番に判定したい場合には、else if 句を組み合わせて使用します。

上から順に判定が行われ、最初に条件を満たしたブロックのみが実行される点に注意してください。

Java
public class ElseIfExample {
    public static void main(String[] args) {
        int temperature = 25;

        if (temperature >= 30) {
            System.out.println("今日は真夏日です。");
        } else if (temperature >= 20) {
            System.out.println("過ごしやすい気温です。");
        } else {
            System.out.println("少し肌寒いかもしれません。");
        }
    }
}
実行結果
過ごしやすい気温です。

このコードでは、まず最初の temperature >= 30 が判定され、false であれば次の temperature >= 20 が判定されます。

一度いずれかの条件に合致すると、それ以降の else ifelse はスキップされます。

条件式で使用する演算子

if文の括弧内に記述する条件式では、比較演算子や論理演算子を駆使して複雑なロジックを組み立てます。

比較演算子の一覧

値を比較するために使用される演算子です。

演算子意味使用例
==等しいa == b
!=等しくないa != b
>より大きいa > b
<より小さいa < b
>=以上a >= b
<=以下a <= b

論理演算子による複数条件の結合

「かつ(AND)」や「または(OR)」といった複数の条件を組み合わせるには、論理演算子を使用します。

  • &&(論理積):左右両方の条件が true の場合に全体が true となります。
  • ||(論理和):左右どちらか一方が true であれば全体が true となります。
  • !(論理否定):条件の真偽を反転させます。true なら false に、false なら true になります。
Java
public class LogicalOperatorExample {
    public static void main(String[] args) {
        int hour = 14;
        boolean isWeekend = true;

        // 土日、かつ、10時から18時の間であれば開店
        if (isWeekend && (hour >= 10 && hour <= 18)) {
            System.out.println("ただいま営業中です。");
        } else {
            System.out.println("本日は休業、または営業時間外です。");
        }
    }
}
実行結果
ただいま営業中です。

Javaのif文における注意点と落とし穴

if文の文法はシンプルですが、Java特有の仕様やコーディング規約に起因するミスが発生しやすいポイントがいくつかあります。

文字列の比較には「==」を使わない

Java初心者にとって最大の難所の一つが、文字列の比較です。

数値型の比較には == を使いますが、文字列(Stringオブジェクト)の比較に == を使うと、内容の比較ではなく「メモリ上の同一オブジェクトかどうか(参照の比較)」が行われてしまいます。

Java
public class StringComparison {
    public static void main(String[] args) {
        String str1 = "Java";
        String str2 = new String("Java");

        // 誤った比較方法
        if (str1 == str2) {
            System.out.println("== で一致しました");
        }

        // 正しい比較方法
        if (str1.equals(str2)) {
            System.out.println("equals() で一致しました");
        }
    }
}
実行結果
equals() で一致しました

期待通りに文字列の内容が同じかどうかを判定したい場合は、必ず equals()メソッド を使用するようにしましょう。

波括弧({})の省略について

if文の処理が一行のみの場合、Javaでは波括弧 {} を省略することができます。

しかし、これはバグの温床になりやすいため、実務では推奨されません

Java
// 省略可能な例(非推奨)
if (score > 90)
    System.out.println("優秀です");
    System.out.println("次のステップへ進みましょう"); // この行はif文の外として扱われる

上記のコードでは、インデント(字下げ)こそ揃っていますが、2つ目のメッセージは条件に関わらず常に実行されてしまいます。

可読性と保守性を高めるため、処理が一行であっても常に波括弧を付ける習慣を身に付けることが大切です。

浮動小数点数の比較

doublefloat といった浮動小数点数は、コンピュータ内部で正確な値を保持できない場合があります。

そのため、if (value == 0.3) といった厳密な一致判定を行うと、計算誤差によって false になるリスクがあります。

実数値を比較する場合は、差の絶対値が極めて小さいかどうかで判定するなどの工夫が必要です。

if文の応用テクニック

基本を理解したら、より高度な書き方や代替手段を学び、コードの品質を向上させましょう。

入れ子(ネスト)構造とその回避

if文の中にさらにif文を書くことを「ネスト」と呼びます。

複雑な条件を表現するのに便利ですが、階層が深くなりすぎるとコードの可読性が著しく低下します。

Java
// ネストが深い例(読みにくい)
if (user != null) {
    if (user.isActive()) {
        if (user.hasPermission("ADMIN")) {
            // 処理
        }
    }
}

このような場合、ガード句(Early Return)を用いることで、ネストを浅く保つことができます。

Java
// ガード句を用いた例(読みやすい)
if (user == null) return;
if (!user.isActive()) return;
if (!user.hasPermission("ADMIN")) return;

// 権限がある場合のメイン処理をここに記述

条件を満たさない場合に早々にメソッドを抜ける(または処理を中断する)ことで、本筋の処理をインデントの浅い位置に記述できるようになります。

三項演算子による簡潔な記述

非常に単純な条件分岐であれば、if-else の代わりに三項演算子を使うことで、コードを一行にまとめることができます。

Java
// 書式: 条件式 ? 真の場合の値 : 偽の場合の値
int age = 20;
String status = (age >= 18) ? "成人" : "未成年";
System.out.println(status);

三項演算子は変数の初期化などで非常に便利ですが、複雑な条件を詰め込みすぎると逆に読みづらくなるため、使い所を見極める必要があります。

switch文との使い分け

特定の変数の値に応じて多方向に分岐させる場合、Java 12以降で強化された switch 文(または switch式)を使う方が適切な場合があります。

特徴if文switch文
柔軟性範囲指定や複数の変数の比較が可能基本的に一つの変数の値の一致判定
可読性条件が複雑になると低下しやすい値のリストアップに対して非常に見やすい
データ型すべてのboolean型式に対応整数、文字列、列挙型(Enum)など

条件が「AがBより大きいとき」といった範囲を伴う場合は if 文、「モードが START、STOP、PAUSE のいずれかのとき」といった値のリストに対する判定であれば switch 文を選択するのが一般的です。

実践的なサンプルコード:成績判定システム

これまでに学んだ内容を盛り込んだ、少し実用的なプログラムを作成してみましょう。

ユーザーの入力値(スコア)に基づいてランクを判定し、さらに特定のボーナス条件をチェックする例です。

Java
public class GradeSystem {
    public static void main(String[] args) {
        int score = 88;
        boolean hasAttendanceBonus = true;
        String grade;

        // 1. 基本的な多方向分岐
        if (score >= 90) {
            grade = "S";
        } else if (score >= 80) {
            grade = "A";
        } else if (score >= 70) {
            grade = "B";
        } else if (score >= 60) {
            grade = "C";
        } else {
            grade = "D";
        }

        // 2. 論理演算子を用いた追加判定
        // Aランク以上で、かつ皆勤ボーナスがある場合は特待生
        if ((grade.equals("S") || grade.equals("A")) && hasAttendanceBonus) {
            System.out.println("ランク: " + grade + " (特待生認定)");
        } else {
            System.out.println("ランク: " + grade);
        }

        // 3. 三項演算子による合否判定
        String result = (score >= 60) ? "合格" : "不合格";
        System.out.println("最終結果: " + result);
    }
}
実行結果
ランク: A (特待生認定)
最終結果: 合格

このサンプルでは、else if による段階的な判定、equals() メソッドによる文字列比較、論理演算子 &&|| の組み合わせ、そして三項演算子を活用しています。

まとめ

Javaのif文は、プログラミングのロジックを構成する最も基盤となる構文です。

単に条件を分岐させるだけでなく、演算子の適切な選択文字列比較の作法、そしてコードの可読性を高めるための書き方を意識することが、プロフェッショナルなエンジニアへの近道となります。

本記事で解説した以下のポイントを心に留めておきましょう。

  • 条件式は必ず boolean 型になるように記述する。
  • 文字列の比較には == ではなく equals() を使用する。
  • 処理が一行であっても波括弧 {} は省略しないのが安全。
  • ネストが深くなりそうなときは、ガード句を使って整理する。
  • 複雑な分岐には三項演算子や switch文の利用も検討する。

if文を正しく理解し活用することで、より堅牢でメンテナンス性の高いJavaプログラムを構築できるようになります。

まずは手元の開発環境で、様々な条件式を試しながらその挙動を確認してみてください。