Java道|if~else文と分岐の基本

true ならこちら、false ならあちら。
if~else文を使うと、Javaの分岐はもっとはっきり書ける。

これまでの if文 では、条件が true のときだけ処理を実行する方法を学びました。
たとえば、入力された値が特定の数だったときだけメッセージを表示する、といった処理です。

ただ、実際のプログラムでは、条件が成り立たなかった場合にも、別の処理を行いたいことがよくあります。

たとえば、入力された値が正しければ案内メッセージを表示し、正しくなければ別のメッセージを表示する。
会員なら特典を表示し、会員でなければ通常案内を表示する。
任務札の番号が特別番号なら特別任務を案内し、そうでなければ通常任務を案内する。

このように、条件が true の場合と false の場合で処理を分けたいときに使うのが if~else文 です。

↓クリックすると拡大表示されます。

if~else文は、条件が true のときの処理と、false のときの処理をセットで書けます。つまり、条件の結果によって「どちらか一方を必ず実行する」分岐を作れる構文です。

この記事では、指定内容に沿って Sample3.java と Sample3.java(拡張)のみを使い、if~else文の基本、true と false の分かれ道、ブロックを使った複数文の処理、if文との違いを、鬼滅の刃風の世界観にたとえながらやさしく整理します。

鬼滅の刃風にたとえると、if~else文は「条件によって進む道を必ずどちらかに決める分岐札」です。
任務札が特別番号なら特別任務へ進む。そうでなければ通常任務へ進む。
このように、true と false の両方に道を用意できるのが if~else文 です。

if~else文とは何か

if~else文は、条件の結果に応じて、2つの処理のうちどちらか一方を実行する構文です。

基本の形は次のようになります。

if(条件)
    文1;
else
    文2;

↓クリックすると拡大表示されます。

この構文では、条件が true のときに 文1 が実行されます。
条件が false のときには 文2 が実行されます。

条件の結果実行される処理
trueif 側の文
falseelse 側の文

ここで大切なのは、どちらか一方が必ず実行されるということです。

if文だけの場合、条件が false なら対象の処理を飛ばして次へ進みました。
しかし、if~else文では、false のときにも else 側の処理を指定できます。

構文true のときfalse のとき
if文指定した処理を実行する何もせず次へ進む
if~else文if 側の処理を実行するelse 側の処理を実行する

鬼滅の刃風にたとえると、if文は「条件が合えば技を出す」だけです。
一方、if~else文は「条件が合えば攻撃の型、合わなければ防御の型」というように、どちらの状況にも行動を用意できます。

日常の判断で考える if~else文

if~else文の考え方は、日常の判断に置き換えると分かりやすいです。

たとえば、次のような判断があります。

if(雨が降っている)
    傘を持って出かける;
else
    そのまま出かける;

雨が降っていれば、傘を持って出かけます。
雨が降っていなければ、そのまま出かけます。

このように、条件が成り立つ場合と、成り立たない場合の両方に処理を用意できるのが if~else文 です。

鬼滅の刃風にたとえると、次のようなイメージです。

if(任務札の番号が5である)
    特別任務の案内を表示する;
else
    通常任務の案内を表示する;

任務札の番号が 5 なら特別任務へ進みます。
5 でなければ通常任務へ進みます。

どちらの場合でも、何かしらの処理が実行されるのがポイントです。

if~else文の流れ

if~else文の流れは、次のように考えると分かりやすいです。

順番処理
1条件を調べる
2条件が true なら if 側の処理を実行する
3条件が false なら else 側の処理を実行する
4実行後、次の共通処理へ進む

if~else文では、if 側と else 側の両方が実行されるわけではありません。
条件の結果によって、片方だけが選ばれます。

条件実行される側実行されない側
trueif 側else 側
falseelse 側if 側

ここが、if~else文の大切な考え方です。

鬼滅の刃風にたとえると、分かれ道で右の道か左の道を選ぶようなものです。
同時に両方の道へ進むことはできません。条件の結果によって、どちらか一方へ進みます。

図:if~else文は二者択一の分岐

↓クリックすると拡大表示されます。

この図が示していること

この図では、if~else文が true と false の2つの道に分かれることを示しています。

条件が true の場合は、if 側の処理が実行されます。
条件が false の場合は、else 側の処理が実行されます。

どちらか一方の処理が終わると、その先の共通の流れへ進みます。
ここから分かることは、if~else文は「条件に応じて2つの処理のどちらか一方を選ぶ構文」だということです。

if~else文の基本構文

あらためて、if~else文の基本構文を確認します。

if(条件)
    文1;
else
    文2;

この構文では、条件が true の場合は 文1 を実行します。
条件が false の場合は 文2 を実行します。

たとえば、次のような考え方です。

if(num == 5)
    5が選ばれたときの処理;
else
    5以外が選ばれたときの処理;

if文だけなら、true のときだけ処理します。
if~else文なら、true のときと false のときの両方の処理を書けます。

判断したいこと向いている構文
条件が true のときだけ処理したいif文
true と false で処理を分けたいif~else文

if~else文は、「条件に合う場合」と「条件に合わない場合」をはっきり分けたいときに便利です。

if~else文を確認する

ここでは、入力された整数が 5 なら特別なメッセージを表示し、5 でなければ別のメッセージを表示するプログラムを見ていきます。

ファイル名:Sample3.java

import java.io.*;

class Sample3
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("任務番号を入力してください。");

        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        int num = Integer.parseInt(str);

        if(num == 5){
            System.out.println("第五任務が選ばれました。");
        }
        else{
            System.out.println("第五任務以外の番号が入力されました。");
        }
    }
}

このプログラムでは、入力された値が 5 であれば、次のメッセージが表示されます。

第五任務が選ばれました。

一方、入力された値が 5 でなければ、次のメッセージが表示されます。

第五任務以外の番号が入力されました。

条件は次の部分です。

num == 5

num が 5 と等しければ true です。
num が 5 以外なら false です。

Sample3.javaの処理の流れ

Sample3.java の処理は、次のように進みます。

順番処理内容
1入力をうながすメッセージを表示する
2キーボードから文字列を読み取る
3入力された文字列を整数に変換する
4num == 5 という条件を調べる
5true なら if ブロックの処理を行う
6false なら else ブロックの処理を行う

注目したいのは、4番から6番の流れです。

if(num == 5){
    System.out.println("第五任務が選ばれました。");
}
else{
    System.out.println("第五任務以外の番号が入力されました。");
}

条件を調べた結果によって、表示されるメッセージが切り替わります。

入力値num == 5実行される処理
5trueif 側の処理
12falseelse 側の処理

このように、if~else文では、条件の結果に応じて処理の道がはっきり分かれます。

5を入力した場合

5 を入力した場合、num == 5 は true になります。

実行例は次のようになります。

任務番号を入力してください。
5
第五任務が選ばれました。

この場合、if ブロックの中にある文が実行されます。

System.out.println("第五任務が選ばれました。");

else ブロックの中の文は実行されません。

条件の結果実行される側表示される内容
trueif 側第五任務が選ばれました。

鬼滅の刃風にたとえると、任務番号が 5 だったため、第五任務の指令が開いた流れです。

5以外を入力した場合

12 を入力した場合、num == 5 は false になります。

実行例は次のようになります。

任務番号を入力してください。
12
第五任務以外の番号が入力されました。

この場合、if ブロックの中の文は実行されません。
代わりに、else ブロックの中の文が実行されます。

System.out.println("第五任務以外の番号が入力されました。");
条件の結果実行される側表示される内容
falseelse 側第五任務以外の番号が入力されました。

ここで大切なのは、else 側は「条件が false のときの処理」だということです。

num が 5 ではない場合、6 でも 12 でも 100 でも、すべて else 側へ進みます。

if~else文のよいところ

if~else文の便利なところは、true の場合と false の場合の処理を、1つのまとまりとして書けることです。

if文だけの場合、条件が false のときの処理は別に考える必要があります。
しかし、if~else文を使うと、条件が成り立つ場合と成り立たない場合をセットで書けます。

場面if~else文が向いている理由
入力が正しいかどうかで表示を変える正しい場合と正しくない場合を分けられる
合格か不合格かを判定する合格時と不合格時の処理を用意できる
会員か非会員かで案内を変える2種類の表示を切り替えられる
特別任務か通常任務かを分ける条件に応じて案内を切り替えられる

つまり、2つの状況に応じて処理を分けたいとき、if~else文はとても使いやすい構文です。

鬼滅の刃風にたとえると、if~else文は「任務札が特別なら特別指令、そうでなければ通常指令」というように、どちらの結果にも対応できる仕組みです。

複数の文を処理するif~else文

if~else文でも、if文と同じように、複数の文をまとめて実行できます。

そのためには、{ } を使ってブロックを作ります。

基本の形は次のようになります。

if(条件){
    文1;
    文2;
}
else{
    文3;
    文4;
}

この構文では、条件が true のときは if ブロック内の文が上から順に実行されます。
条件が false のときは else ブロック内の文が上から順に実行されます。

条件の結果実行される範囲
trueif ブロック内
falseelse ブロック内

ブロックを使うことで、複数の処理をひとまとまりとして扱えます。

複数文の分岐を確認する

次に、true の場合も false の場合も、それぞれ2つの文を実行する例を見ていきます。

ファイル名:Sample3.java(拡張)

import java.io.*;

class Sample3
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("任務番号を入力してください。");

        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        int num = Integer.parseInt(str);

        if(num == 5){
            System.out.println("第五任務が選ばれました。");
            System.out.println("特別指令を表示します。");
        }
        else{
            System.out.println("第五任務以外の番号が入力されました。");
            System.out.println("通常指令を表示します。");
        }
    }
}

このプログラムでは、条件が true の場合は if ブロック内の2文が実行されます。
条件が false の場合は else ブロック内の2文が実行されます。

if(num == 5){
    System.out.println("第五任務が選ばれました。");
    System.out.println("特別指令を表示します。");
}
else{
    System.out.println("第五任務以外の番号が入力されました。");
    System.out.println("通常指令を表示します。");
}
条件の結果実行される処理
trueif ブロック内の文が上から順に実行される
falseelse ブロック内の文が上から順に実行される

ここで大切なのは、片方のブロックだけが実行されることです。
if ブロックと else ブロックの両方が実行されるわけではありません。

Sample3.java(拡張)で5を入力した場合

5 を入力した場合、num == 5 は true になります。

実行例は次のようになります。

任務番号を入力してください。
5
第五任務が選ばれました。
特別指令を表示します。

この場合、if ブロック内の2つの文が順番に実行されています。

入力値条件実行されるブロック
5trueif ブロック

else ブロック内の文は実行されません。

Sample3.java(拡張)で5以外を入力した場合

12 を入力した場合、num == 5 は false になります。

実行例は次のようになります。

任務番号を入力してください。
12
第五任務以外の番号が入力されました。
通常指令を表示します。

この場合、else ブロック内の2つの文が順番に実行されています。

入力値条件実行されるブロック
12falseelse ブロック

if ブロック内の文は実行されません。

図:ブロックを使ったif~else文の流れ

↓クリックすると拡大表示されます。

この図が示していること

この図では、ブロックを使った if~else文 の流れを示しています。

条件 num == 5 が true の場合は、if ブロック内の文が上から順に実行されます。
条件 num == 5 が false の場合は、else ブロック内の文が上から順に実行されます。

ここから分かることは、if~else文では条件の結果に応じて、片方のブロックだけが実行されるということです。
true 側と false 側の両方が同時に実行されることはありません。

if文との違いを整理する

if文 と if~else文 は似ていますが、役割が違います。

構文条件が true のとき条件が false のとき
if文指定した処理を行う何もせず次へ進む
if~else文if 側の処理を行うelse 側の処理を行う

if文は、条件が true のときだけ何かをしたい場合に使います。

たとえば、

if(num == 5){
    System.out.println("第五任務が選ばれました。");
}

この場合、num が 5 のときだけメッセージを表示します。
5 ではない場合は何も表示せず、次へ進みます。

一方、if~else文は、true と false の両方に処理を用意したい場合に使います。

if(num == 5){
    System.out.println("第五任務が選ばれました。");
}
else{
    System.out.println("第五任務以外の番号が入力されました。");
}

この場合、num が 5 なら if 側、5 でなければ else 側が実行されます。

使いたい場面選ぶ構文
条件が合うときだけ処理したいif文
条件が合う場合と合わない場合で処理を分けたいif~else文

鬼滅の刃風にたとえると、if文は「条件がそろったら技を出す」。
if~else文は「条件がそろったら攻める、そろわなければ守る」という分かれ方です。

ブロックとインデントを丁寧に書く

if~else文では、処理の範囲を分かりやすくするために、ブロックとインデントを丁寧に書くことが大切です。

if(num == 5){
    System.out.println("第五任務が選ばれました。");
    System.out.println("特別指令を表示します。");
}
else{
    System.out.println("第五任務以外の番号が入力されました。");
    System.out.println("通常指令を表示します。");
}

{ } の中が、それぞれのブロックです。

ブロック実行される条件
if ブロック条件が true のとき
else ブロック条件が false のとき

インデントには文法上の意味はありません。
しかし、コードの読みやすさには大きく影響します。

特に if~else文 は処理の流れが分かれるため、インデントが乱れていると、どこまでが if 側で、どこからが else 側なのか分かりにくくなります。

読みやすいコードを書くためにも、ブロックとインデントはセットで意識しましょう。

if~else文を読むときのポイント

if~else文を読むときは、次の順番で確認すると分かりやすくなります。

確認すること見る場所
条件は何かif の丸かっこの中
true のとき何をするかif ブロック
false のとき何をするかelse ブロック
複数文があるか{ } の中
どちらが実行されるか条件の true / false

たとえば、次のコードを見るときは、

if(num == 5){
    System.out.println("第五任務が選ばれました。");
}
else{
    System.out.println("第五任務以外の番号が入力されました。");
}

まず条件を確認します。

num == 5

次に、true のときの処理を確認します。

System.out.println("第五任務が選ばれました。");

最後に、false のときの処理を確認します。

System.out.println("第五任務以外の番号が入力されました。");

この順番で見ると、処理の分かれ方が整理しやすくなります。

if~else文を理解するための重要ポイント

if~else文を学ぶときは、次の点を押さえておくと安心です。

ポイント内容
条件によって2通りの処理を分けられるtrue と false で動きが変わる
必ずどちらか一方が実行されるif 側か else 側のどちらか
両方は実行されない条件の結果で片方だけ選ばれる
複数の文は { } でまとめるブロックで処理のまとまりを作る
if文より分岐が明確false の場合の処理も書ける
インデントを整えると読みやすい処理の範囲が見えやすくなる

if~else文は、条件分岐をより分かりやすく書くための基本構文です。

if~else文は分岐の基本を広げる構文

if~else文は、if文の基本を一歩進めた構文です。

if文では、条件が true のときだけ処理を実行しました。
if~else文では、条件が true のときの処理と、false のときの処理を分けて書けます。

構文考え方
if文条件が true なら実行する
if~else文true ならこちら、false ならあちらを実行する

実際のプログラムでは、「条件に合うときだけ処理する」だけでなく、「条件に合う場合と合わない場合で別々の処理をする」場面がたくさんあります。

たとえば、正解なら正解メッセージ、不正解なら再挑戦メッセージ。
合格なら合格表示、不合格なら復習案内。
特別任務なら特別指令、通常任務なら通常指令。

このような二者択一の処理を表すとき、if~else文はとても便利です。

鬼滅の刃風にたとえると、if~else文は「状況を見て、攻めるか守るかを必ず決める分岐の型」です。
この型をしっかり理解しておくと、この先に学ぶ if~else if~else文 のような複数条件の分岐も自然に理解しやすくなります。