プログラミングの醍醐味! Javaで“条件式”を理解する【改訂版】Eclipseではじめるプログラミング(3)(3/3 ページ)

» 2009年02月25日 00時00分 公開
[小山博史株式会社ガリレオ]
前のページへ 1|2|3       

条件を変えて、ソースコードフォーマット機能を使ってみよう

 次に確認のために、「if (true)」の部分を「if (false)」と変更し、「x = 1」の部分を「x = 2」と変更してみましょう。

 ただし、リスト5のままではif文による処理の流れが一目では分かりにくいので、Eclipseのソースコードフォーマット機能を活用して見た目を整えます。Sample32クラスのソースコードを表示しながら、メニューで[ソース]→[フォーマット]を指定して実行すると、リスト6のように整形できます。

リスト6
public class Sample32 {

    /**
    * @param args
    */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        if (true)
            System.out.println(true);
        else
            System.out.println(false);

        int x;
        x = 1;

        if (x < 3)
            System.out.println(true);
        else
            System.out.println(false);

        if (x >= 3) {
            System.out.println(true);
        } else if (0 < x && x < 2) {
            System.out.println(false);
            System.out.println(true);
        } else {
            System.out.println(false);
            System.out.println(false);
        }
    }
}

 最初のif文では条件式がfalseなので、「System.out.println(false);」が実行されます。次のif文ではxが2のときは条件式「(x < 3)」がtrueなので、「System.out.println(true);」が実行されます。3つ目のif文ではxが1のときは条件式(x>=3)がfalseなので、この場合はelse以降の文が実行されます。

 ここでは、そこにまたif文がありxが2のときは条件式(0<x && x<2)がfalseなので、{ System.out.println(false); System.out.println(false); }のブロックが実行されます。これらのことから、実行結果は以下のようになります。

リスト6の実行結果
false
true
false
false

 このほか、xの値を負の値にしたり、3より大きい値にしたりして実行してみると、さらに理解が深まると思います。興味のある読者は試してみてください。

場合分けが多いときにはコンパクトな「switch文」

 図3のような処理はif-then-else文でも表現可能ですが、変数の値によって処理を複数に分岐したい場合には、switch文を使うとコンパクトに記述できる場合があります。

図3 場合分けが多い処理の例 図3 場合分けが多い処理の例

 switch文の書き方を説明する前に、図3の処理の流れをif-then-else文とswitch文で実現した場合を比較してみましょう(表3)。

表3 if-then-else文とswitch文の比較
if-then-else文 switch文
前処理文

if (x == 1) {
    処理1文
}
else if (x == 2) {
    処理2文
}
else {
    処理3文
}

処理4文
前処理文

switch (x) {
  case 1:
    処理1文
    break;
  case 2:
    処理2文
    break;
  default:
    処理3文
}

処理4文

 if-then-else文では比較している変数が「 x 」かどうかを全部の条件式を確認しないと分かりませんが、switch文ではそれが一目で分かります。switch文では、「x == 0」というような式をたくさん書かなくてもいいというのもうれしい点です。

switch文の書き方

 それでは、switch文の書き方を見てみましょう。switch文は次のように記述するのが基本です。

前処理文

switch (式) {
  case 値1:
    文1
    break;
  case 値2:
    文2
    break;
  default:
    文3
}

 ただし、式には評価結果が整数値となるものしか使えません。式の結果がcaseで指定した値に一致する場合には、その値に対応するcaseに行き、そこで文が実行されます。式の結果と一致する値がcaseで指定されていない場合はdefaultに行き、文3が実行されます。

break文は、「switch文を抜け出す」

 break文は、「switch文を抜け出す」という命令です。break文がないとswitch文を抜け出さないので、処理が次の行へ流れていくことに注意しましょう。例えば、「case 値2:」の直前にあるbreak文を削除すると、プログラム実行時に式の評価結果が値1となると文1と文2が実行されてしまいます。

またまた注意! 「評価結果が整数値となる式」

正確には評価結果がchar、byte、short、int、Character、Byte、Short、Integer、enum型となる式です。

byte、short型は整数値を表す型で、表現できる値の範囲がint型よりも狭くなっています。char型は文字と対応する文字コードの整数値を保持するための型なので、評価結果が整数値となります。ただし、int型よりも大きな整数値を表現できるlong型は使えないので、注意しましょう。

Character、Byte、Short、Integer型は、それぞれchar、byte、short、int型と対応する「ラッパークラス」と呼ばれるものです。enum型とは「列挙型」とも呼ばれる特殊な型です。クラスやenum型については連載の中で別途説明しますので、ここでは、そういうものがあるとだけ、知っておけば十分です。


もう分かってますね? switch文もJavaで書いてみよう

 それでは、単純なサンプルプログラムを動作させてみましょう。if-then文サンプルプログラムを作成したときと同様にしてSample33クラスを作成し、リスト7のようにコードを追加してください。

リスト7
public class Sample33 {

    /**
    * @param args
    */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int x;
        x = 1;

        switch (x) {
          case 0:
            System.out.println(0);
            break;
          case 1:
            System.out.println(1);
            break;
          case 2:
            System.out.println(2);
            break;
          case 3:
            System.out.println(3);
            break;
          default:
            System.out.println(-1);
        }
    }
}

 このプログラムを実行するとxの値が1なので、「case 1 :」に行き、「System.out.println(1);」が実行されて、「1」が出力されます。

リスト7の実行結果
1

 xの値を「5」にすると、「default :」に行き、「System.out.println(-1);」が実行されて「-1」が出力されます。

xの値を「5」にしたリスト7の実行結果
-1

 さらに、xの値を0、2、3と変更して実行して動作を確認してみるとよいでしょう。xの値と同じ数値が出力されるはずです。

break文を書かないと……

 なお、break文を書かない場合の動作を確認するために、リスト8に示すSample34クラスを作成してみましょう。

リスト8
public class Sample34 {

    /**
    * @param args
    */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int x;
        x = 1;

        switch (x) {
          case 0:
            System.out.println(0);
          case 1:
            System.out.println(1);
          case 2:
            System.out.println(2);
          case 3:
            System.out.println(3);
          default:
            System.out.println(-1);
        }
    }
}

 break文がないと、caseで一致する値に対応する処理を実行してもswitch文から抜けないため、続く処理が実行されると説明をしました。ですから、例えばxの値が「0」の場合は、数値を出力する処理がすべて実行されるということになります。Sample34クラスを実行すると、次のようになります。

リスト8の実行結果
0
1
2
3
-1

処理の流れを制御してプログラミングを楽しもう

 今回は、場合によって処理を変えるプログラムを作成するのに必要な条件分岐処理の記述方法について解説しました。「基本的にはif文を使用すればよい」ということと、「場合によってはswitch文を使用するとすっきりした記述ができる」ということの2点を理解できたでしょうか。

 また、書いた順に処理を実行するだけではなく、if文やswitch文を使えば処理の流れを制御(コントロール)できるということも理解できたでしょうか。そうそう、Eclipseのソースコードをフォーマットする機能も重宝するはずです。活用してください。

 処理の流れを制御できるようになると、プログラムにいろいろな動作をさせることができるようになるので、プログラミングをする楽しみが増えます。今回の解説で、ある程度プログラムの処理の流れを制御できるようになりましたが、完全に処理を制御するためには繰り返し処理という制御も必要です。そこで、次回は繰り返し処理について解説する予定です。

筆者紹介

小山博史(こやま ひろし)

情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)bugs(J)の活動へも参加している。

著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。



「【改訂版】Eclipseではじめるプログラミング」バックナンバー
前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。