Java | 基礎文法:論理演算子

Java Java
スポンサーリンク

論理演算子の全体像

Java の論理演算子は条件を組み合わせて真偽を計算するための道具です。中心は短絡評価の &&(AND)と ||(OR)、反転の !(NOT)で、結果は必ず booleantrue/false)になります。C 言語のように 0 や非 0 を真偽として扱えず、数値と論理を混ぜないのが Java の基本姿勢です。複雑な条件は「読み手が自然文に言い換えられる」単位に分解してから組み立てると、正確さと可読性が両立します。


AND(&&)、OR(||)、NOT(!)

基本的な使い方

&& は「両方が真なら真」、|| は「どちらかが真なら真」、! は「真偽を反転」です。最も頻出するのは「前提を左に、コストやリスクのある検査を右に置く」AND の並べ方です。短絡評価により、結果が確定した時点で右側は評価されないため、安全な順序を設計できます。

int score = 75;
boolean isMember = true;

if (score >= 60 && isMember) {
    System.out.println("割引適用");
} else {
    System.out.println("通常料金");
}

boolean ok = !(score < 60); // NOT で反転(60未満なら false)
Java

短絡 OR は「早期に真が確定する」ため、代替条件やフォールバックの設計に向いています。読み手が追える長さに保ち、意図が伝わる変数名を付けるのがコツです。


短絡評価と安全なガード(重要ポイントの深掘り)

評価順序で例外を防ぐ

&&|| は左から評価し、結果が決まれば右を評価しません。これを利用して「存在確認 → 使用」という順序にすれば、NullPointerException や範囲外アクセスを防げます。

String name = null;

// 左が false(name != null)なので右は呼ばれない。例外なしで false。
boolean startsWithJ = (name != null) && name.startsWith("J");
System.out.println(startsWithJ);
Java

配列やリストでも同様に「範囲内か?」を左で確認してから右でアクセスします。危険な処理(I/O、重い計算)を右に置くことで、不要なコストも避けられます。


非短絡の論理演算子(&、|、^)と違いの理解

&、|、^ は「必ず両辺を評価」する

&| はビット演算子として知られていますが、boolean に対しても論理 AND/OR として動作します(ただし非短絡)。^ は論理 XOR(どちらか一方が真なら真)です。副作用のあるメソッド呼び出しを条件に含めると、&&/|| と挙動が変わるため注意が必要です。

static boolean logAndTrue() {
    System.out.println("右が評価された");
    return true;
}

public static void main(String[] args) {
    // 短絡 AND:左が false なので右は評価されない
    boolean a = false && logAndTrue(); // 何も表示されない

    // 非短絡 AND:両辺を必ず評価する
    boolean b = false & logAndTrue();  // 「右が評価された」と表示される
}
Java

原則として条件分岐には短絡の &&/|| を使い、&/| は「両辺を評価したい理由があるとき」に限定しましょう。^ は「トグル」や「片方だけ真」を明示したい場面で有効です。


演算の優先順位、括弧、デ・モルガンの法則(重要ポイントの深掘り)

優先順位と括弧の明示

! が最優先、次に &&、最後に || の順で評価されます。誤解されやすい式は括弧で意図を明示すると安全です。

boolean a = true, b = false, c = true;
boolean r1 = a || b && c;        // b && c が先、結果は true
boolean r2 = (a || b) && c;      // 括弧で意図を変える(true && true)→ true
Java

「読み手が計算順序を考えずに理解できるか」を基準に、括弧を惜しまないのがプロの書き方です。

デ・モルガンの法則で否定を整理

条件の否定は「全部に NOT を配る+AND/OR を入れ替える」と読みやすく整理できます。

boolean inRange = (x >= 10) && (x <= 20);
boolean outOfRange = !(x >= 10 && x <= 20);       // 否定
boolean outOfRange2 = (x < 10) || (x > 20);       // デ・モルガンで同義、こちらが読みやすい
Java

否定を外側に大きく掛けると理解が難しくなるため、法則を使って「肯定形に近い表現」に変換するのがおすすめです。


実用例で身につける

例 1: 入力検証(必須・長さ・形式)

public class Validator {
    public static void main(String[] args) {
        String email = "user@example.com";
        boolean present = email != null && !email.isBlank();
        boolean hasAt = present && email.contains("@");
        boolean lengthOk = present && email.length() <= 256;

        if (present && hasAt && lengthOk) {
            System.out.println("検証OK");
        } else {
            System.out.println("検証NG");
        }
    }
}
Java

前提(存在・非空)を左で満たし、詳細条件を右で積み上げると、安全で読みやすい検証になります。途中変数に名前を与えることで意図が明確になります。

例 2: 権限と状態の組み合わせ(短絡の設計)

public class Access {
    public static void main(String[] args) {
        boolean isAdmin = true;
        boolean isActive = false;
        boolean has2FA = true;

        if (isAdmin && isActive && has2FA) {
            System.out.println("管理画面に入れます");
        } else {
            System.out.println("条件を満たしていません");
        }
    }
}
Java

前提条件(アカウント状態)を左、コストの高いチェック(たとえば外部照合)を右に置くことで、不要な評価を避けられます。

例 3: フォールバック(OR の利用)

public class Fallback {
    public static void main(String[] args) {
        String cfgEnv = System.getenv("APP_NAME");
        String cfgSys = System.getProperty("app.name");
        String name = (cfgEnv != null && !cfgEnv.isBlank())
                   ? cfgEnv
                   : (cfgSys != null && !cfgSys.isBlank())
                     ? cfgSys
                     : "MyApp";
        System.out.println(name);
    }
}
Java

OR の考え方で「使えるものがあればそれを、なければ次へ」というフォールバック連鎖を設計できます。各段で前提(非 null・非空)を守れば安全です。


仕上げのアドバイス(重要ポイントのまとめ)

短絡の &&/|| を使い、左に前提、右にコストやリスクのある検査を置いて安全な評価順序を作りましょう。否定はデ・モルガンの法則で整理し、読みやすい肯定形に近づけます。&/|/^ は「必ず両辺を評価する」ことを理解し、特殊な意図があるときにのみ使用します。優先順位は !&&||、誤解の余地は括弧で潰す。条件が長くなったら途中変数で意味を名前に乗せる——この習慣が論理のバグを大幅に減らします。

タイトルとURLをコピーしました