条件分岐文 Java 基本

modified at:08 March 2016

if 文

if 文は、「関係演算子や論理演算子」(演算子を参照)を利用した条件式を持ち、その条件式の結果に応じた処理を行いたい場合に使用します。下は単純なif文の例です。

単純なif文
int num = 10;
//....numに対する色々な処理
if (num < 10) {
    System.out.println("numは10未満です。");
}
if 文の書式
if ( 条件式 ) {
    // 条件式が「真(true)」の時の処理
}

「if」の後ろの「{」と「}」で囲まれた範囲をブロックと呼びますが、そのブロック内の処理が実行されるのは、ifの直後の「( )」内の条件がtrueの時です。

論理演算子の「&&」(「and」、「かつ」)や「||」(「or」、「または」)などを利用することにより複数の条件をつなげることができます。これら論理演算子の優先順位は「&」←「|」←「&&」←「||」(左ほど優先順位が高い)になります。

「男性/女性(女性が1、男性が2)」、「国籍(例えば、番号ごとに国が割り振られていて、日本が10、韓国が11等)」、それと年齢を格納する変数を考えます。
  1. 「gender = 1」が女性、「gender = 2」が男性
  2. 「nationality = 10」が日本、「nationality = 11」が韓国、(その他は省略)
  3. 「age」は年齢
この変数を用いて「日本と韓国の30歳未満の女性」を表す条件式を作ってください。

参照型の変数を使った条件式

参照型の変数を比較する場合も「==」や「!=」を使用することができますが、これは変数が参照しているデータの中身の比較ではなく、参照先のアドレスが同じかどうか(つまり同じオブジェクトであるかどうか)を比較します。ただし、何も参照していないという「null」と比較することもできます。

次のコードは「StringBuilder」の例です。同じオブジェクトを参照している変数の比較「==」は「true」になり、文字列が同じでも異なるオブジェクトを参照している変数の比較「==」はfalseになります。

参照型の比較
public class StringBuilderSample {
    public static void main(String[] args) {
        // str1にStringBuilderオブジェクトを生成して代入
        StringBuilder str1 = new StringBuilder();

        // str1のアドレスをstr2に代入
        StringBuilder str2 = str1;

        // str3はstr1やstr2とは関係のない別のオブジェクトを生成
        StringBuilder str3 = new StringBuilder();

        // str4はnullで初期化(何も指していない)
        StringBuilder str4 = null;

        str1.append("abc");
        str3.append("abc");
        // str1, str2, str3全て文字列「abc」になる。

        // str2はstr1のオブジェクトのアドレスをコピーしたので同じオブジェクトです。
        if (str1 == str2) {
            System.out.println("str1とstr2は同じオブジェクトを指しています。");
        }

        // str1とstr3は別々にnewしたので、格納している文字列は同じですが、別のオブジェクトです。
        if (str1 != str3) {
            System.out.println("str1とstr3は同じオブジェクトではありません。");
        }
        // str4はnullなので下の条件はtrueです。
        if (str4 == null) {
            System.out.println("str4はnullのままです");
        }
    }
}

上のコードの3つのif文の条件は全てtrueなので、全て出力されます。

文字列の中身で比較したいと思うでしょうが、それは別のところでお話しします。

else文、else-if文

上で見てきたif文は「ある条件」が成り立っていれば「ある処理」を行う、というものでした。

単純なif文

「処理0」を行った後、if文の「条件」がtrueの時ブロック「処理A」を行い、その後処理1に進みます。if文の「条件」がfalseの時にはブロックをとばして、処理1に進みます。

このようにif文のブロックが分岐処理の対象になります。ただし、次のようにブロック内が1行だけの場合のみ、「{}」を省略することができます。

{}を省略した書き方
if (gender == 1)
    System.out.println("ファッションショーへの招待状を出します");
//この行以降は、上のif文とは無関係(genderがなんであれ、実行されます)です。

さて、先ほどの単純なif文では、「条件」がfalseの場合処理Aは実行されませんでしたが、falseの時には別の「処理B」を行い、その後「処理1」に進むようにするには「else句」を使います。

if-else 文

「条件」がtrueの場合は先ほどと同じくブロックAが実行され、falseの場合「else句」以降のブロックBが実行され、その後処理1が実行されます。

すなわち、条件によって、「ブロックA」か「ブロックB」のいずれかの処理が行われます

今度は複数の条件で複数の処理に分岐させます。それには先ほどの「else」に条件を付加した「else-if 文」を使います。

if-else if 文

この図では、条件1がtrueならば処理Aが実行され、falseならば条件2をチェックしてtrueならば処理Bが実行され、falseならば条件3をチェックしてtrueならば処理Cが実行され、falseならば処理Dを実行します。

この図のように一番最後が「else」の場合は処理A~Dのいずれかが必ず実行されますが、最後が「else if(条件式)」のブロックで終わる時には、すべての条件式がfalseの場合A〜Dの処理がいずれも実行されないことになります。

最後にif文が「入れ子(ネスト)」になっている場合を考えます。これは「if文」の中にさらに「if文」があるものです。

if文の入れ子

図では最初に、条件1によって、処理を大きく2つに分岐させます(ブロックAとブロックB)。そして、それぞれのブロックの中で、さらに「条件2と条件3とelse」、「条件4と条件5とelse」の3つずつに分岐させています

このような入れ子の階層には制限がありませんが、あまりにも階層が深くなるととても読みにくいコードになりますので、3〜4階層程度の入れ子までにしておくのが無難だと思います。

if文の入れ子(ネスト)の例
public class IfNestSample {
    public static void main(String[] args) {
        int point = 0;
        // なんらかの処理でpointが99
        // ・・・・
        point = 99;
        if (70 <= point) {
            System.out.println("合格"); // 99点は70以上なので出力されます。
            if (100 == point) {
                System.out.println("表彰状授与!!"); // 99点は100点ではないので出力されません。
            } else if (99 == point) {
                System.out.println("皆で褒め称えよう!"); // 99点で一致するので出力されます。
            }
        } else if (point < 40) { // すでに上のブロックに入ったのでこのブロック以降は無視されます。
            System.out.println("落第!!"); // 出力されません。
        } else {
            System.out.println("不合格!"); // 出力されません。
        }
    }
}

switch文Topへ

switch文という分岐処理の方法があります。これは、分岐が多くなる場合に便利です。

switch文
switch () {
    case 値1:
        処理A;
        break;
    case 値2:
        処理B;
        break;
    default:
        処理C;
}

switch文は、switch句の次のカッコの中の「式」を評価し(変数も可)、返ってきた値とcaseで指定した値とを比較し、一致した場合にそのcase以降に記述した処理(複数行可能)を実行します。

比較の結果一致しない場合は、次のcaseの値と比較、それとも一致しない場合は次のcaseの値というように、順繰りにチェックされます。一致するcaseがない場合、「default:」に記述されている処理が実行され、記述がなければ何も実行されずにswitchを抜けます。

また、「break;」行があるかないかで、挙動が変わります。一致したcaseの中に「break;」があると、そこでswitch文から抜けます。もし「break;」がないと残りのswitch文の処理が最後まで実行されます。

switch文

switch文の「式」の結果は、データ型としてbyte、char、short、int,enum、Stringのいずれかの値である必要があります(StringはJava7から加えられました)。また、「式」に関係演算子や論理演算子を使えないので複雑な条件を書くのが苦手です。

下の例は、コマンドラインのオプションとして与えれた数字により処理を変えたいケースです。

switch文の例(コマンドラインでオプションを指定)
public class SwitchSample {
    public static void main(String[] args) {
        // 引数でオプションの数字を指定していないと、args.lengthが0になっている
        if (args.length == 0) {
            System.out.println("1〜5までの数字を指定して下さい");
            System.exit(1); // これでプログラムが終了します。
        }
        // 引数にa等の文字を与えるとエラーになります。
        int i = Integer.parseInt(args[0]);
        switch (i) {
            case 1: // コロンを忘れないように
                System.out.println("処理1を実行します");
                break;
            case 2:
                System.out.println("処理2を実行します");
                break;
            case 3:
                System.out.println("処理3を実行します");
                break;
            case 4:
                System.out.println("処理4を実行します");
                break;
            case 5:
                System.out.println("処理5を実行します");
                break;
            default:
                System.out.println("1〜5までの数字を指定して下さい");
        }
    }

}

上記のサンプルをコンパイルし、カレントディレクトリをclassファイルのある場所に移動させ、実行してみて下さい。

   C:¥>cd C:¥java_work

C:¥java_work>

C:¥java_work>java SwitchSample 2
処理2を実行します

C:¥java_work>java SwitchSample
1〜5までの数字を指定して下さい

C:¥java_work>java SwitchSample 6
1〜5までの数字を指定して下さい

三項演算子(条件演算子)Topへ

最後に、三項演算子(条件演算子)と呼ばれる分岐文を見てみましょう。一般式は次のようになります。

三項演算子の一般式
``` 条件式 ? 式1 : 式2 // 式1と式2の間は「:(コロン)」 ```

「条件式」がtrueの場合「式1」が評価され、「条件式」がfalseの場合「式2」が評価されます。これは、一行で書けるif-elseの縮小版のようなものです(つまり、if文に必ず書き換えられます)。

三項演算子
char c;
int num = 1; // 1は女性、2は男性
c = num == 1 ? '女' : '男';
System.out.println("あなたは" + c + "性ですね"); // 「あなたは女性ですね」と出力されます。

if文で書くことができます。

三項演算子をif文で書き換えたコード
char c;
int num;
num = 1; // 1は女性、2は男性
if (num == 1) {
    c = '女';
} else {
    c = '男';
}
System.out.println("あなたは" + c + "性ですね"); // 「あなたは女性ですね」と出力されます。

上記2つのコードでは「num」が1以外だと全て「男性」になります。そこで1と2以外の場合は「中性」と出力されるようにしてみます。

三項演算子のネスト
char c;
int num;
num = 3; // 1は女性、2は男性、それ以外は「中性」
c = num == 1 ? '女' : num == 2 ? '男' : '中';
System.out.println("あなたは" + c + "性ですね"); // 「あなたは中性ですね」と出力されます。

if (num == 1) {
    c = '女';
} else if (num == 2) {
    c = '男';
} else {
    c = '中';
}
System.out.println("あなたは" + c + "性ですね"); // 同様に「あなたは中性ですね」と出力されます。

このように三項演算子も入れ子にできます。しかしif文に比べ、三項演算子の入れ子(ネスト)はコードの可読性が落ちると感じる人が多いようです。

  created at:05 July 2015




[投稿する]場合は、 枠の中の図形をマウスでドラッグして、(あるいは指で)なぞって下さい。それほど厳密でなくても大丈夫です。