1. ネストした if の基本構文
現実の世界では、判断を一つの基準だけで行うことは稀です。たいていは複数の条件を同時に確認する必要があり、しかもそれらは互いに依存していることがよくあります。例えば、コンサートに入るには成人であるだけでは不十分で、ときには招待リストに載っている必要もあります。ここで登場するのがいわゆる多層ロジックで、私たちを助けてくれるのがネストされた if 演算子です。
入れ子の条件とは、一つの if が別の if の中にある状態のことです。箱の中に箱があると想像してください。外側の条件が満たされたときにだけ内側が評価されます。これはフロー制御の強力な道具です。
まずは簡単な例から:
if (uslovieA)
{
// uslovieA が true の場合の処理
if (uslovieB)
{
// 両方の条件が真の場合の処理
}
}
if が別の
if の内側にある
マトリョーシカを連想したなら、その理解で正しいです。内側の if は外側が成立したときにのみ実行されます。
例: クラブへの入場
以前、ユーザーが名前と年齢を入力する学習用アプリを作りました。ここに第2段階のチェックを加えましょう。例えば、会員制クラブに入るには、21 歳以上でかつ招待コードを持っている必要があるとします。
System.out.print("お名前を入力してください: ");
String name = console.nextLine();
System.out.print("年齢を入力してください: ");
int age = console.nextInt();
if (age >= 21)
{
System.out.print("招待コードを入力してください: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("ようこそ、" + name + "、VIP クラブへ!");
}
else
{
System.out.println("申し訳ありません。コードが正しくありません。アクセスは許可されません。");
}
}
else
{
System.out.println("申し訳ありません。入場は21歳以上のみです!");
}
注意: 内側の if は、年齢のチェックをすでに通過した場合にのみコードを確認します。これはリソース(そして警備員の神経)を節約します。
2. どれくらいの入れ子の深さが許容されるか?
技術的にはいくつでも可能です。しかし実務では、入れ子が深くなるほどコードの読み書きや保守が難しくなります。通常は 2~3 段程度に抑えるのが一般的です。もし 4+ 段のネストされた if の「はしご」のような形になっているなら、ロジックを簡素化するか、チェックをメソッドに切り出せないか検討しましょう。
3. ネストされた if と else: 罠と注意点
初心者のミス: 波括弧の不用意な使い方。
Java では else を使うときの厳格なルールとして、波括弧 {} を付けない場合、if または else に続く最初の1文だけが対象になります。これはよくあるバグの原因です。
誤りを生みやすい例:
if (age >= 21)
if (code.equals("VIP2024"))
System.out.println("ようこそ!");
else
System.out.println("コードが正しくありません。");
多くの人は else が年齢のチェックに対応すると期待しますが、実際にはその直前の if(招待コードのチェック)に対応します。そのため、メッセージが想定どおりに表示されないことがあります。1 行だけでも必ず括弧を使いましょう。
誤解を避けるために、コンパイラはこのコードを次のように解釈します:
if (age >= 21)
{
if (code.equals("VIP2024"))
System.out.println("ようこそ!");
else
System.out.println("コードが正しくありません。");
}
重要: もう一度。 if-else 構文で波括弧を省略すると、else は直前(最も近い)の if に結び付きます。
4. 代替案: else if を入れ子の条件で使う
ときには外側の if の中で、追加の条件を確認するだけでなく代替案も用意したいことがあります。例えば招待コードが合わない場合、ゲストアクセスを提案するか、入場を拒否することができます。
if (age >= 21)
{
System.out.print("招待コードを入力してください: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("クラブへようこそ!");
}
else if (code.equals("GUEST"))
{
System.out.println("ゲストモード: 入場は23:00まで。");
}
else
{
System.out.println("残念ながら、アクセスできません。");
}
}
else
{
System.out.println("入場は21歳以上のみです。");
}
ここでは外側の分岐の中で、3 つのシナリオ(VIP コード、ゲストコード、拒否)の間で入れ子の選択をしています。
5. 実践: 多層ロジックによる割引計算機
ユーザーの年齢と会員カードの有無に基づいて割引を付与するとします。
- ユーザーの年齢が 60 以上なら、割引は 15%。
- それより若くても、会員カードがある場合は割引が 7%。
- それ以外は割引なし。
どう書けばよいでしょうか?
System.out.print("年齢を入力してください: ");
int age = console.nextInt();
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
System.out.print("会員カードはありますか (はい/いいえ)? ");
String hasCard = console.nextLine();
if (hasCard.equals("はい"))
{
discount = 0.07;
}
}
System.out.println("あなたの割引: " + (discount * 100) + "%");
ここでは else の分岐の中に入れ子の if を使っています。年齢が条件を満たさなかった場合にだけ、カードについて尋ねます。
GO TO FULL VERSION