Java 条件分岐
条件分岐ステートメント(Conditional Statements)は、コードに「意思決定」の能力を与え、特定のコンディション(条件)に基づいて異なるコードブロックを実行することを可能にします。
条件分岐はプログラムにロジックと柔軟性を注入し、プログラムがさまざまなインプット(入力)や突発的な状況に対して動的にレスポンス(応答)できるようにします。条件分岐がなければ、プログラムは実行されるたびに、入力データに関わらず、流れ作業のように機械的に全く同じインストラクション(命令)を実行するだけになってしまいます。
本章では、Java における if、else if、および else ステートメントを深く掘り下げ、よりスマートで適応性の高いプログラムを記述するための必須ツールを提供します。
1. 単一の分岐:if ステートメント
if ステートメントは、Java において最も基礎的な条件制御ステートメントです。これは、指定されたコンディションが真(true)である場合にのみ、特定のコードを実行することを可能にします。
1.1 構文構造
if ステートメントの基本構文は以下の通りです。
if (condition) {
// condition (条件) の結果が true の場合、このコードが実行される
}- condition (条件): これはブーリアン(Boolean)式であり、最終的な評価結果は必ず
trueまたはfalseになります。 - {} (波括弧): 条件が満たされたときに実行される「コードブロック」を囲みます。コードブロックが1行しかない場合、構文上は波括弧を省略できますが、コードの可読性を高め、将来的なバグを防ぐために、常に波括弧を使用することを強く推奨します。
1.2 コードサンプル
例 1:基本的な if ステートメント
int age = 20;
if (age >= 18) {
System.out.println("あなたには投票資格があります。");
}
// 出力: あなたには投票資格があります。この例では、プログラムはコンディション age >= 18 を評価します。age の値は 20 であるため、条件が成立(true)し、コンソールにメッセージが表示されます。
例 2:ブーリアン変数を条件として使用する
boolean isRaining = true;
// boolean バリアブル(変数)を直接入れるだけで動作します。isRaining == true と書く必要はありません。
if (isRaining) {
System.out.println("外出の際は傘を忘れないでください。");
}2. 二重の分岐:else ステートメント
else ステートメントは常に if ステートメントの後に続き、「代替案」を提供します。if 内の条件が偽(false)である場合に、else 内のコードが実行されます。
2.1 構文構造
if (condition) {
// 条件が true の場合、ここを実行
} else {
// 条件が false の場合、ここを実行
}2.2 コードサンプル
例 1:二者択一の選択
int age = 16;
if (age >= 18) {
System.out.println("あなたには投票資格があります。");
} else {
System.out.println("申し訳ありませんが、まだ法定投票年齢に達していません。");
}
// 出力: 申し訳ありませんが、まだ法定投票年齢に達していません。16 が 18 以上であるという条件は誤り(false)であるため、プログラムは if ブロックをスキップし、else ブロック内のコードを実行します。
例 2:奇数か偶数かの判定
int number = 7;
if (number % 2 == 0) {
System.out.println(number + " は偶数です。");
} else {
System.out.println(number + " は奇数です。");
}この例では剰余演算子(%)を巧みに使用しています。ある数を 2 で割った余りが 0 であれば偶数であり、そうでなければ必ず奇数となります。
3. 多重分岐:else if ステートメント
現実世界の意思決定では、選択肢が2つだけとは限りません。else if ステートメントを使用すると、複数の異なるコンディションを連鎖的にチェックできます。これは、複雑で多様な可能性があるビジネスロジックを処理するために不可欠です。
3.1 構文構造
if (condition1) {
// 条件1 が true の場合、ここを実行
} else if (condition2) {
// 条件1 が false で、かつ 条件2 が true の場合、ここを実行
} else if (condition3) {
// 条件1 と 2 が false で、かつ 条件3 が true の場合、ここを実行
} else {
// 上記のすべての条件が満たされない(すべて false)場合、最終的なデフォルト処理を実行
}else if ブロックはいくつでも記述できます。最後の else ブロックはオプショナル(任意)ですが、通常はエラーハンドリングやデフォルトの保全策として使用されます。注意点: いずれかの条件が満たされると、対応するコードブロックを実行した後、プログラムは即座に if-else 構造全体を抜け出し、それ以降の条件チェックは行われません。
3.2 コードサンプル
例 1:標準的な成績評価システム
int score = 85;
if (score >= 90) {
System.out.println("グレード: A");
} else if (score >= 80) {
System.out.println("グレード: B");
} else if (score >= 70) {
System.out.println("グレード: C");
} else if (score >= 60) {
System.out.println("グレード: D");
} else {
System.out.println("グレード: F (不合格)");
}
// 出力: グレード: B例 2:月による季節の判定(論理演算子との組み合わせ)
int month = 4; // 4月
if (month >= 3 && month <= 5) {
System.out.println("季節: 春");
} else if (month >= 6 && month <= 8) {
System.out.println("季節: 夏");
} else if (month >= 9 && month <= 11) {
System.out.println("季節: 秋");
} else if (month == 12 || month == 1 || month == 2) {
System.out.println("季節: 冬");
} else {
System.out.println("エラー:無効な月です");
}この例では、前の章で学んだ論理積(&&)と論理和(||)を条件判断に組み合わせる方法を示しています。
4. ネストされた if ステートメント (Nested if)
if ステートメントの中に別の if ステートメントを入れることができます。これを「ネスト(入れ子)」と呼びます。これは、大きな条件を満たしたという前提の上で、さらに詳細な条件を深掘りして判断する場合に使用します。
4.1 コードサンプル
例:複雑な資格審査
int age = 25;
boolean isCitizen = true;
// 第1レイヤー:年齢のチェック
if (age >= 18) {
System.out.println("あなたは投票可能な年齢に達しています。");
// 第2レイヤー:年齢が十分である場合にのみ、市民権をチェック
if (isCitizen) {
System.out.println("あなたは正当な市民です。投票に行ってください!");
} else {
System.out.println("しかし、市民権を持っていないため、投票はできません。");
}
} else {
System.out.println("投票するには若すぎます。");
}5. 業界のベストプラクティス
- 波括弧
{}を決して省略しない: たとえifの後が1行のコードであっても、必ず波括弧を付けてください。これにより、非常に発見しにくいバグを防ぐことができます。 - 条件を簡潔に保つ: もし
ifの括弧内の論理式が長くなりすぎる場合は、意味の明確な複数のブーリアン変数に分割することを検討してください。 - 厳密なロジックの完結:
if - else ifを記述する際は、すべての境界ケース(エッジケース)を考慮し、予期せぬデータに備えてelseによるデフォルト処理を追加するのが最善です。 - 「ネスト地獄」への警戒: 3層を超えるネストされた
ifステートメントは、コードの可読性を極端に低下させます(いわゆる「アローコード」)。このような場合は、早期リターン(Early Return)の使用や他のデザインパターンへのリファクタリング(再構築)を検討すべきです。