Javaプログラミング入門 4章 [制御構文] Part1

Java

こんにちは。ECF Techブログ
担当 Michiharu.Tです。

Javaプログラミング入門記事の第4章をお送りいたします。
第4章のテーマは「制御構文」です。
内容がやや多いため、2回のパートに分けて掲載します。今回はPart1です。

本連載の初回および章立ての一覧については下記のリンクから確認できます。

Javaプログラミング入門 0章
0章 Javaプログラミングを始めよう こんにちは。ECF Techブログ 担当 Michiharu.Tです。 この記事はプログラミング言語のJavaを、実際に動かしながら学びたい人のための学習教材となっています。手を多く動かすこと、感覚を...

解説動画

2023/12/11 解説動画を掲載しました。

4-1 制御構造

制御構造は、プログラムを構成する処理の流れのことで「順次」「分岐」「反復」の3つがあります。
制御構造

  • 順次:命令を上から順に実行する。
  • 分岐:条件に基づき、実行する命令をいずれかに決定する。
  • 反復:条件に基づき、同じ命令をくり返す。

制御構文は、このうち分岐と反復を実現する構文です。Javaにおける構文には次のようなものがあります。

  • 分岐:if文、switch文
  • 反復:while文、do-while文、for文

早速これらの構文についてご紹介したいところですが、制御構文を扱うためには条件式を理解する必要があります。次節ではまず、条件式について学習します。

4-2 条件式と演算子

条件式とは、演算結果がboolean型(trueまたはfalse)と評価される式のことです。truefalseは簡単に言えばYesNoです。

4-2-1 比較演算子

比較演算子は2つの値を比較するための演算子です。演算結果はboolean型と評価されるため条件式を構成できます。主な比較演算子を下表に示します。

演算子 条件式の例 例の意味
== a == 5 aと5は等しい
!= a != 5 aと5は異なる
<= a <= 5 aは5以下である
>= a >= 5 aと5以上である
< a < 5 aは5より小さい
> a > 5 aは5より大きい
  • aは変数であることを示しています。
  • 条件式の内容が正しければtrue、そうでなければfalseとなります。

プログラム例を示します。

プログラム例

public class Main{
    public static void main(String[] args){
        int a = 5;
        int b = 8;
        System.out.println(a == 5);//aは5である
        System.out.println(b != 8);//bは8ではない
        System.out.println(a < 5); //aは5より小さい
        System.out.println(a <= 5);//aは5以下である
        System.out.println(a > b); //aはbより大きい
        System.out.println(b >= a);//bはa以上である
    }
}

実行結果

true
false
false
true
false
true

解説

  • a == 5は「aと5が等しい」です。変数aは5なのでtrueとなります。
  • b != 8は「bは8ではない」です。変数aは8なのでfalseとなります。
  • a < 5は「aは5より小さい」です。変数aは5なのでfalseとなります。
  • a <= 5は「aは5以下」です。変数aは5なのでtrueとなります。
  • a > bは「aはbより大きい」です。変数aは5、bは8なのでfalseとなります。
  • b >= aは「bはa以上」です。変数aは5、bは8なのでtrueとなり

4-2-2 論理演算子

論理演算子は複数の条件式を組み合わせて、さらに複雑な条件式を書くことができる演算子です。論理演算子には次の3つがあります。

記号 例の意味
|| a || b aまたはbtrueならtrue
&& a && b abtrueならtrue
! !a afalseならtrue
  • aとbは、boolean型と評価される値または式でなければいけません。

プログラム例を示します。

プログラム例

public class Main{
    public static void main(String[] args){
        int a = 5;
        int b = 8;
        //aが5 かつ bが7 ならtrueを表示
        System.out.println( a==5 && b==7 );
        //aが5 または bが7 ならtrueを表示
        System.out.println( a==5 || b==7 );
        //aが5 でなければtrueを表示
        System.out.println( !(a==5) );
    }
}

実行結果

false
true
false

解説

  • 各文の意味はコメントにあるとおりです。
  • &&||は比較演算子よりも優先順位が低いため、2つの条件式を踏まえた判定 ができる式を作ることができます。
  • !は比較演算子よりも優先順位が高いため、a==5()で囲んでいます。a==5trueならfalsefalseならtrueを表示します。
難しいと感じる方は、評価の考え方を思い出すと良いかもしれません。a==5 && b==7の例で言えば、下図のようになります。
論理演算

4-2-3 文字列同士の比較

文字列(String)型同士を比較し、同じ文字列かどうかを判定することができます。文法は次のとおりです。

文字列1.equals(文字列2)

文字列1と文字列2が同一の文字列であれば、この記述はtrueと評価されます。
プログラム例を示します。

プログラム例

public class Main{
    public static void main(String[] args){
        String str = "Apple";
        //変数strと「Apple」を比較
        System.out.println( str.equals("Apple") );
        //変数strと「Banana」を比較
        System.out.println( str.equals("Banana") );
        //「Banana」と「Banana」を比較
        System.out.println( "Banana".equals("Banana") );
    }
}

実行結果

true
false
true

解説
リテラルや変数など、String型と評価できるものであれば.equals(~)の記述を使って文字列同士を比較できます。

4-3 if文

if文は分岐を実現する制御制御構文です。次の3つのブロックを使って構成します。if文の全体像を示します。
if文

いくつかのパターンを使って、if文のプログラム例を説明します。

4-3-1 if文(ifブロックのみ)

始めにifブロックのみを使用するパターンです。
ifブロックの文法を示します。

if(条件式){
    //条件式がtrueの場合の処理
}

ifブロックは・・・

  • if文の最初に必須です。
  • 記述できるのは1つだけです。
  • 条件式がtrueの場合にブロック内の処理を実行します。

プログラム例を示します。

プログラム例

public class Main{
    public static void main(String[] args){
        int a = 6;//(1)
        if(a >= 5){
            System.out.println("aは5以上です");
        }
        System.out.println("プログラム終了");
    }
}

実行結果

aは5以上です
プログラム終了

解説
ifブロックの条件式はa >= 5となっています。つまり、aが5以上ならブロック内の処理を行います。例では変数aの値は6なので、「aは5以上です」が表示されます。

また、(1)の行をint a = 4;に変更すると実行結果は下記となります。

実行結果(aが4の場合)

プログラム終了

条件式a >= 5falseとなるため、「aは5以上です」が表示されません。

4-3-2 if文(elseブロックの使用)

次にelseブロックを使用した例です。elseブロックを含む文法パターンを示します。

if(条件式){
    //条件式がtrueの場合の処理
} else {
    //条件式がfalseの場合の処理
}

この文例では

  • ifブロック内の条件式がtrueなら、ifブロック内の処理
  • ifブロック内の条件式がfalseなら、elseブロック内の処理

を実行します。プログラム例を示します。

プログラム例

public class Main {
    public static void main(String[] args) {
        int a = 4;
        if( a >= 5 ) {
            System.out.println("aは5以上です。");
        } else {
            System.out.println("aは5より小さいです。");
        }
        System.out.println("プログラム終了");
    }
}

実行結果

aは5より小さいです。
プログラム終了

解説
条件式はa >= 5なので変数aが5以上なら、ifブロック内の処理を実行します。ですが、変数aは4なので条件式はfalseとなり、elseブロックの処理を実行します。

4-3-3 if文(else ifブロックの使用)

次にelse ifブロックを使用した例です。else ifブロックを使うと、ifブロックの条件がfalseの場合に別の条件式を設定できます。

else ifブロックを含む文法パターンを示します。

if(条件式1){
    //条件式1がtrueの場合の処理
} else if(条件式2) {
    //条件式2がtrueの場合の処理
}

この例の場合

  • 条件式1がtrueならifブロック内の処理
  • 条件式1がfalseで、条件式2がtrueならelse ifブロック内の処理

を行います。プログラム例を示します。

プログラム例

public class Main {
    public static void main(String[] args) {
        int a = 4;
        if( a >= 5 ) {
            System.out.println("aは5以上です。");
        } else if( a == 4 ) {
            System.out.println("aは4です。");
        }
        System.out.println("プログラム終了");
    }
}

実行結果

aは4です。
プログラム終了

解説

  • ifブロックの条件式はa >= 5ですが、変数aは4なのでこの条件式の結果はfalseとなります。
  • 次にelse ifブロックの条件式を判定します。条件式はa == 4です。変数aは4なので条件式はtrueとなり、「aは4です。」 が表示されます。

4-3-4 多数の条件分岐

if文を構成する3つのブロックをつなげていくことで、多数の条件分岐を実現できます。プログラム例を示します。

プログラム例

public class Main {
    public static void main(String[] args) {
        int a = 8;
        if(a >= 10){
            System.out.println("aは10以上");
        } else if(a % 2 == 0){
            System.out.println("aは偶数です");
        } else if(a == 5){
            System.out.println("aは5です");
        } else{
            System.out.println("aは上記以外です");
        }
    }
}

実行結果

aは偶数です。

解説
次の順番で動作します。

  • ifブロックの条件式a >= 10を判定します。判定結果はfalseとなります。
  • 次にelse ifブロックの条件式a % 2 == 0を判定します。判定結果はtrueとなり、このelse ifブロック内の処理が実行されます。
  • 以降のelse ifブロック、elseブロックは処理されずプログラムが終了します。

一連のif文において、2つ以上のブロック内の処理は行なわれません。あくまで「どれか1つの処理に決める」イメージです。

4-4 switch文

switch文はによって分岐を実現する、シンプルな分岐構文です。

switch(式){
    case 値1:
        //式が値1の場合の処理
    break;
    case 値2:
        //式が値2の場合の処理
    break;
    :
    default:
      //式がいずれの値でもない場合の処理
    break;
}
  • 式の値が、caseの値のいずれかに該当するとその位置まで処理がジャンプします。
  • break;はブロックを抜ける命令です。実行されるとswitchブロックの次へ移ります。
  • 式の評価結果とcaseの各値の型は一致させる必要があります。
  • 評価結果として使える方にはintcharStringなどがあります。

プログラム例を示します。

プログラム例

public class Main {
    public static void main(String[] args) {
        int value = 1;
        switch(value) {
        case 0:
            System.out.println("大吉");
            break;
        case 1:
            System.out.println("中吉");
            break;
        case 2:
            System.out.println("小吉");
            break;
        default:
            System.out.println("凶");
            break;
        }
    }
}

実行結果

中吉

解説

  • switch文の式はvalueとなっています。valueの値は1なので、case 1:に処理がジャンプします。
  • 画面に「中吉」が表示されます。
  • break;が実行されることでswitch文を抜け、処理が終了します。

次にswitch文で陥りやすいポイントをご紹介します。プログラム例を示します。

プログラム例

public class Main {
    public static void main(String[] args) {
        int value = 1;
        switch(value) {
        case 0:
            System.out.println("大吉");
            break;
        case 1:
            System.out.println("中吉");
        case 2:
            System.out.println("小吉");
            break;
        default:
            System.out.println("凶");
            break;
        }
    }
}

実行結果

中吉
小吉

解説
1つ前のプログラム例から、10行目のbreak;を削除しただけのものです。switchブロック内は該当するcaseに移動した後、break;に到達するまで、(case 2:の記述などは関係なく)処理が上から順番に実行されます。したがって、「中吉」と「小吉」が表示されてしまいます。case 値:の記述自体はあくまでジャンプ地点を示すラベルのようなもので、処理を分岐させるものでは無い点に注意が必要です。

case 値:の記述は、caseラベルと言います。
タイトルとURLをコピーしました