未来エンジニア養成所Blog

プログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】制御構造(分岐:if文)

title

プログラムは、条件によって処理する内容を変えることが必要です。

例えばユーザが印刷の処理を実行した場合、プログラムもユーザの入力に従って印刷処理を行う必要があります。

しかし、ユーザがどのような処理を望んでいるかはプログラムを実行してみなくてはわかりません。


つまり、次のようなプログラムを作る必要があります。

  • 実行時にどのような状態で実行されているかプログラムで調べる
  • 調べた結果に従って必要な処理を実行する

上記の2つを実現するのが、「関係演算、論理演算」「制御構造」です。


「ある条件が成り立っているか?」を調べるのが論理演算や関係演算であり、「どのような処理をするか」を決定するのが制御構造です。


関係演算とは

「Aの方がBより大きい」「AとBは等しい」など変数や数値の間の関係を調べるのに使います。


論理演算とは

複数の関係演算を組み合わせてより複雑な条件を表すために使います。

「AとBが等しく、且つBは100より大きい」など。


論理演算と関係演算の結果は、「真(true)」または「偽(false)」の2種類です。

これらの演算結果を保持しておく変数はboolean型の変数になります。


制御構造とは

プログラムの実行する部分を論理演算や関係演算子の結果に応じて変更できるようにするのが制御構造です。

例えば、ある値が10より大きければAという処理を、もし値が10以下であればBという処理をする、などのプログラムを記述する場合に制御構造が必要となります。



関係演算

関係演算で数値等の大小関係や等号関係を調べていきます。

この関係演算をJavaプログラムの中で行うために「関係演算子」を用います。

関係演算子は、数値の大小関係や等号関係を表す記号(「演算子」)です。


まとめると以下の表になります。

演算子 意味 真(true)の場合 偽(false)の場合
== 等しい 1 == 1 2 == 1
!= 等しくない 2 != 1 1 != 1
>= 以上 1 >= 0 2 >= 3
<= 以下 1 <= 4 2 <= 1
> より大きい 1 > 0 0 > 1
< より小さい 0 < 1 1 < 0


ポイント!

数学の等号「=」は、Javaでは「==」で表現されます。


これらはあくまでも演算子なので、内部では演算を行います。


結果として2つの値を比較して、その関係が正しければtrueを、正しくなければfalseを返します。

返ってきたtrueおよびfalseという値は、この後に述べる制御構造などで利用されます。


ポイント! char型と数値について

char型数は数値としての側面を持っているので、文字も関係演算子などで大小を比較することができます。


【関係演算子】

public class BooleanTest{
    public static void main(String[ ] args){
        int num = 5;
        boolean b = (num % 2 == 0);
        System.out.println(num + "は偶数ですか?" + b);
    }
}


実行結果

5は偶数ですか?false



【関係演算子2】

public class BooleanTest2{
    public static void main(String[ ] args){
        int a = 10;
        int b = 12;

        System.out.println("a = " + a + ", b = " + b);
        System.out.println("a == b : " + (a == b));
        System.out.println("a != b : " + (a != b));
        System.out.println("a >= b : " + (a >= b));
        System.out.println("a <= b : " + (a <= b));
        System.out.println("a > b : " + (a > b));
        System.out.println("a < b : " + (a < b));
    }
}


実行結果

a = 10, b = 12
a == b : false
a != b : true
a >= b : false
a <= b : true
a > b : false
a < b : true


論理演算

上記では関係演算を確認しましたが、この関係演算の結果を組み合わせてより複雑な条件の真偽を調べたい場合があります。


例えば、「預金の残高が、買いたい物の値段より安く、かつ月末に大きな出費がない」という条件が成り立つかどうかの真偽を判定するには関係演算子と「かつ」「ない」といった論理演算と組み合わせています。


Java言語では、このようなより複雑な条件を記述するために「論理演算子」を用います。

論理演算子 機能 真になる場合
&& AND(かつ) どちらも正しいとき
|| OR(または) どちらかが正しいとき
! NOT(ない) 正しくないとき(否定)


【論理演算子】

public class LogicalConnectives{
    public static void main(String[ ] args){
        int a = 10;
        int b = 12;
        int c = 13;

        boolean b1 = ( a == b && a != c );
        boolean b2 = ( a == b || a != c );
        boolean b3 = !( a == b && a != c );
        boolean b4 = !( a == b || a != c );

        System.out.println(" b1 = " + b1 );
        System.out.println(" b2 = " + b2 );
        System.out.println(" b3 = " + b3 );
        System.out.println(" b4 = " + b4 );
    }
}


実行結果

b1 = false
b2 = true
b3 = true
b4 = false


用語:否定

否定は「~ではない」事を表します。

trueはfalseに、falseはtrueとなります。


制御構造

プログラムはいつも同じ処理ばかり行うわけではありません。


たとえば、あるキーが押されたら処理Aを行い、別のあるキーが押されたら処理Bを行い…といったように、何らかの条件判断を行った結果を元に、選択的に処理を実行することが必要になる場合があります。


プログラムの流れを決定するものをプログラムの制御構造といいます。

どんなに複雑なプログラムでも、3つの制御構造を組み合わせていくことによって記述することができます。


3つの制御構造は次の通りです。

  • 順次実行
    プログラムを上から順番に実行します。
    制御構造を特に利用しないプログラムは順次実行となります。

  • 分岐実行
    ある条件によって複数の文のうちからどれかを実行します。
    if文を使ったものやswitch文を使ったものが分岐実行となります。

  • 繰り返し実行
    ある条件を満たしている間は同じ部分を繰り返し実行します。
    while文やfor文を使ったものが繰り返し実行となります。


用語:フローチャート(フロー図)

フローチャートとはプログラムの制御構造を視覚的に図示したものです。

このフローチャートによって、「どのような条件で分岐するのか?」「どのような条件で繰り返すのか?」を表すことができます。

フロー図の意味は以下の通りです。

フローチャート


順次実行

順次実行とは最も単純な制御構造です。

今まで作成したプログラムは全てこの順次実行という制御構造になります。


順次実行はプログラムのソースコードに書かれた処理を上から順番に実行していきます。

順次実行


if文

「条件式」に設定された内容を検査し、条件が成立した場合だけ中括弧(「{」と「}」)で囲われた文(処理)を実行します。

条件式とは前述の関係演算子を用いた比較文のことを指します。


条件が成立したときだけ中括弧で囲われた文(処理)を実行します。

このように「ある場合だけ、特別に処理を実行したい」場合はこのif文のような制御構造を用います。


if文の書式は以下の通りです。

if ( 条件式 ) {
    文;
}

上記のようなif文に対応するフローチャートは以下の通りです。

if文


条件式とboolean型

Javaでは条件式を必ずboolean型で指定します。

例えば1 == 1のように結果がtrueかfalseになる式がboolean型になり、1 + 1のように結果が整数になるような式が整数型になります。

決まりとしてJavaは条件式にboolean型以外を指定することができないことを覚えておきましょう。


【if文】

public class IfTest{
    public static void main(String[ ] args){
        int num = 6;
        if(num % 2 == 0){
            System.out.println(num + "は偶数です");
        }
    }
}


実行結果

6は偶数です


ポイント!

if文の後の中括弧はif文の後、条件式が成り立ったときに実行する文(処理)が1行しかないときは省略することができます。

先ほどのIfTest.javaのソースコードは、以下のIfTestSample.javaソースコードと同一になります。

public class IfTestTestSample{
    public static void main(String[ ] args){
        int num = 6;
        if(num % 2 == 0)
            System.out.println(num + "は偶数です");
    }
}


ポイント! 節(ブロック)

if文の条件式が成立したときに実行される文は、中括弧を書かなければ次の1文のみ処理が行われます。

そこで条件式が成立した時、複数行を実行する方法として中括弧で複数の文を括るのです。


この中括弧でかこまれた一連の文を「節」や「ブロック」と呼びます。

if文の後の節は「if節」や「ifブロック」と呼ばれます。


else節

条件式が真(true)の場合だけなにか特別なことを実行するのではなく、条件式が成立する時としない時で行う処理を別にしたい場合、if節と共にelse節を続けて書きます。

if(条件式){
    // 条件式が成立(true)の時実行されるブロック
    文1a;
    文1b;
}else{
    // 条件式が不成立(false)の時実行されるブロック
    文2a;
    文2b;
}


フローチャートは以下の通りです。

else文


【else節】

public class IfTest2{
    public static void main(String[ ] args){
        int num = 7;
        if(num % 2 == 0){
            System.out.println(num + "は偶数です");
        }else{
            System.out.println(num + "は奇数です");
        }
    }
}


実行結果

7は奇数です


複数のelse-if

複数の条件式を設定したい場合はelse if文を使い、以下のように記述します。

if(条件式1){
    文1a;
    文1b;
}else if(条件式2){
    文2a;
    文2b;
}else{
    文3a;
    文3b;
}


フローチャートは次の通りです。

else-if文


【if文2】

public class IfTest3{
    public static void main(String[ ] args){
        int a = 30;
        int b = 40;
        if((a + b) < 60){
            System.out.println("aとbの合計は60未満です");
        }else if((a + b) < 100){
            System.out.println("aとbの合計は60以上100未満です");
        }else{
            System.out.println("aとbの合計は100以上です");
        }
    }
}


実行結果

aとbの合計は60以上100未満です



【if文3】

public class IfTest4{
    public static void main(String[ ] args){
        int a = 30;
        int b = 40;
        if((a + b) < 60){
            System.out.println("aとbの合計は60未満です");
        }else{
            if((a + b) < 100){
                System.out.println("aとbの合計は60以上100未満です");
            }else{
                System.out.println("aとbの合計は100以上です");
            }
        }
    }
}


実行結果

aとbの合計は60以上100未満です


ポイント!

IfTest3.javaとIfTest4.javaは同じことを書いていますが、ソースコードの見易さから一般的にIfTest3.javaのように書くことが多いでしょう。


【if文と論理演算子】

public class IfTest3{
    public static void main(String[ ] args){
        int a = -1;
        int b = 4;
        if(a > 0 && b > 0){
            System.out.println("aとbは両方とも正の数です");
        }else{
            System.out.println("aとbは両方、もしくは片方は正の数ではありません");
        }
        if(a > 0 || b > 0){
            System.out.println("aとbは両方、もしくは片方は正の数です");
        }else{
            System.out.println("aとbは両方とも正の数ではありません");
        }
    }
}


実行結果

aとbは両方、もしくは片方は正の数ではありません
aとbは両方、もしくは片方は正の数です


switch文

沢山の選択肢の中から1つを選択する場合、if文ですと「else if」を複数書く必要があります。


しかしif文よりもすっきりと記述を行う方法があります。

それが、switch文です。

swtich文は複数ある選択肢の中で1つを選びたいときに用います。

switch(式){
    case 定数式1:
        文1;
        break;
    case定数式2:
        文2;
        break;

    default:
        文4;
        break;
}


フローチャートは以下の通りです。

switch文


switch文の特徴

switch文は上記のように表すことができます。

switch文は式を評価して、caseラベルに続けて書かれた定数式と一致するcase以下の文を実行します。

複数の分岐を行う処理を比較的見やすく記述できます。


  • defaultラベル

どのcaseとも一致しない場合の処理を、default: の後に記述することができます。

defaultラベルは必要がなければ省略することも可能です。

  • 式やcaseの後に書かれる定数式

式やcaseの後に書かれる定数式はtrueやfalseのboolean型の変数や定数ではありません。

式の値を(整数として)計算し、その結果と一致したcaseブロックを実行しています。

つまり整数の値を元に分岐を行います。float型やdouble型は使えません。

さらに整数型であってもlong型は使えません。

byte、char、short、int、enum、String のデータ型の値が使用できます。


【switch文】

public class SwitchTest{
    public static void main(String[ ] args){
        int i = 2;

        switch(i){
        case 1:
            System.out.println("iは1です");
            break;
        case 2:
            System.out.println("iは2です");
            break;
        case 3:
            System.out.println("iは3です");
            break;
        default:
            System.out.println("iは1,2,3以外です");
        }
    }
}


実行結果

iは2です


break文

switch文の中にbreak文が記述されていますが、break文の働きはbreakが実行されるとswitch文を終了します。

break文の記述は任意です。


では記述しなかった場合はどのようになるのでしょうか。

switch(式){
    case 定数式1:
    文1;
    case定数式2:
    文2;
    break;
    case定数式3:
    文3;
}


フローチャートは以下の通りです。

break


つまりbreak文が記述されていない場合、次のcaseの範囲も実行するのです。

breakが処理されるか、switch節が終了するまで、次のcaseの範囲を実行し続けます。

なお、今回の例では、文3の下にbreakが無くても結果は同じになります。


【switch文の実行】

public class CheckSeason{
    public static void main(String[ ] args){
        int month = 10;
        switch(month){
            case 3:
            case 4:
            case 5:
                System.out.println(month + "月は春です");
                break;
            case 6:
            case 7:
            case 8:
                System.out.println(month + "月は夏です");
                break;
            case 9:
            case 10:
            case 11:
                System.out.println(month + "月は秋です");
                break;
            case 12:
            case 1:
            case 2:
                System.out.println(month + "月は冬です");
                break;
            default:
                System.out.println("存在しない月が入力されました。");
                break;
        }
    }
}


実行結果

10月は秋です


まとめ

  • 関係演算子
    関係演算子を用いることで特定の条件を判断することができます。

  • 論理演算子
    論理演算子と関係演算子を組み合わせてより複雑な条件を判断する場合に使用することができます。

  • if文
    if文を用いて特定の条件が成り立つ場合に行う処理を記述したり、成り立たない場合の処理を記述することができます。
    またif文を繰り返したり、else if文を用いることで複数の分岐に対応することができます。

  • switch文
    switch文を用いることで複数の分岐に対応することができます。
    if文よりも簡潔に記述できるのが特徴です。


参考図書



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work phoeducation.work