SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

即戦力にならないといけない人のためのJava入門

Javaの基本的な演算と制御構文

即戦力にならないといけない人のためのJava入門 第3回

5. 制御構文

 処理によっては、特定の条件の場合のみ行わなければならない処理や、繰り返し行わなければならない処理など、処理の制御が必要になることがあります。ここではif文とswitch文による条件分岐とfor文とwhile文による繰り返しの処理について見ていきます。

5.1. if文

 if文は条件によって処理を分岐させたい場合に使われる構文です。if文は「()」内の条件を評価し、その条件がtrueなら、その条件に定義されている処理のみを実行します。また、if文では「else if」を使うことにより複数の条件分岐を行うことができ、「else」はif文やelse if文のすべての条件に当てはまらない場合に処理が実行されるものです。if文の基本的な書式は次になります。

if ( 条件1 ) {
    ……処理1
} else if ( 条件2 ){
    ……処理2
} else {
    ……処理3
}

 この構文の流れはifの条件1がtrueの場合に処理1のみを実行します。もし条件1がfalseの場合は次のelse ifの条件2を判定し、結果がtrueなら処理2のみを実行します。もし、どの条件にも当てはまらない場合はelseのブロックに記述されている処理3が実行されます。

 また、指定した条件が条件1にも条件2にも複数当てはまる場合、先に定義してある条件1の処理1のみ実行します。

 また、「else if」の箇所と「else」の箇所は省略が可能で、省略された場合は「if」での条件がtrueの場合のみ、その条件の処理を行い、条件に合わなければif文で定義してある処理に関して何もしないことになります。

 それでは、次のif文のサンプルを実行してみましょう。このサンプルでは実行時にコマンドライン引数を渡します。引数を渡さないと例外が発生するので注意してください。

package jp.codezine.java.sample03;

/**
 * if文のサンプルを実行し、その内容を確認するクラス。
 */
public class IfStatement {

    /**
     * if文を実行し、その内容を確認します。
     * 
     * @param args
     *            int値に変換する文字列が指定されているコマンドライン引数。
     */
    public static void main(String[] args) {
        // 引数の文字列を int 値に変換
        int value = Integer.valueOf(args[0]);

        // [1] if文
        if (value == 0) {
            System.out.println("[1] value は 0");
        } else if (value == 1) {
            System.out.println("[1] value は 1");
        } else {
            System.out.println("[1] value は 0 でも 1 でもない");
        }
    }
}

 実行結果はコマンドライン引数の値によって変わってきます。それぞれの実行結果は次のものになります。

コマンドライン引数に「0」を入力した場合:
[1] value は 0
コマンドライン引数に「1」を入力した場合:
[1] value は 1
コマンドライン引数に「2」を入力した場合:
[1] value は 0 でも 1 でもない

Eclipseでのコマンドライン引数を入力の仕方

 Eclipseからコマンドライン引数を入力して実行するには次の手順で行います。

5.2.switch文

 Javaの条件分岐の構文はif文だけでなくswitch文もあります。switch文の基本的な書式は次になります。

switch ( 評価値 ) {
case 値1:
    ……処理1
    break;
case 値2:
    ……処理2
    break;
default:
    ……処理3
} 

 このswitch文は評価値と同じ値がcaseの値にあると、そのcaseに記述されている処理を実行します。もし、該当するcaseがない場合はdefaultでの処理(処理3)が実行されます。例えば評価値が値1と同じ場合、処理1が実行されbreak文でswitch文の処理を終了します。また、評価値が値1とも値2とも同じでない場合はdefaultの処理(処理3)が実行されます。

 評価値に使えるデータの型はbyte、char、byte、short、int、enumになります。またJava 7以降はStringも使えるようになっています。

 また、switch文ではcaseごとの処理の最後に「break;」を記述します。これはswitch文ではcaseの処理にbreakがない場合、そのcaseでの処理を実行し終えてもcaseから出ずに、評価値とまったく違う次のcaseの処理も行ってしまうためです。その性質を利用したプログラミングをする可能性もあるのですが、単にbreak文を忘れたのかが分かりづらくなるので、そのような使い方をする場合は十分注意してください。

 それではまず、breakをつけたサンプルを見てみましょう。

SwitchStatement1.java
package jp.codezine.java.sample03;

/**
 * switch文のサンプルを実行し、その内容を確認するクラス。
 */
public class SwitchStatement1 {

    /**
     * switch文を実行し、その内容を確認します。
     * 
     * @param args
     *            コマンドライン引数。今回は使われません。
     */
    public static void main(String[] args) {
        // 引数の文字列を int 値に変換
        int value = Integer.valueOf(args[0]);

        // [1] switch文
        System.out.println("■ [1] switch文 -------");
        switch (value) {
        case 0:
            System.out.println("[1] value は 0");
            break;
        case 1:
            System.out.println("[1] value は 1");
            break;
        default:
            System.out.println("[1] value は 0 でも 1 でもない");
        }
    }
}

 実行結果はコマンドライン引数の値によって変わってきます。それぞれの実行結果は次のものになります。

コマンドライン引数に「0」を入力した場合:
[1] value は 0
コマンドライン引数に「1」を入力した場合:
[1] value は 1
コマンドライン引数に「2」を入力した場合:
[1] value は 0 でも 1 でもない

 次にbreakが入っていないサンプルを実行してみましょう。ここではコマンドライン引数に「0」を渡します。

SwitchStatement2.java
package jp.codezine.java.sample03;

/**
 * switch文のサンプルを実行し、その内容を確認するクラス。
 */
public class SwitchStatement2 {

    /**
     * switch文を実行し、その内容を確認します。
     * 
     * @param args
     *            コマンドライン引数。今回は使われません。
     */
    public static void main(String[] args) {
        // 引数の文字列を int 値に変換
        int value = Integer.valueOf(args[0]);

        // [1] switch文
        switch (value) {
        case 0:
            System.out.println("[1] value は 0");
        case 1:
            System.out.println("[1] value は 1");
        default:
            System.out.println("[1] value は 0 でも 1 でもない");
        }
    }
}
実行結果:
[1] value は 0
[1] value は 1
[1] value は 0 でも 1 でもない

 このように、switch文にbreakがない場合、該当のcaseで終わらず、それ以降の条件とマッチしないcase文まで、break文が出てくるか、switch文が終了するまで、実行してしまいます。

5.3. for文

 Javaで繰り返しの処理する場合、for文を使って繰り返しの処理を行うことができます。for文の書式は次のようになっています。

for ( カウンタの初期化; 条件; カウンタの増減 ){
    ……処理
}

 慣例的な例としてループ時のカウンタの変数名を「i」とし、次のように定義します。これは毎回iが1加算され、iが最大値になるまでfor文内の処理を行うことを意味しています。

for (int i = 0; i <= 最大値; i++) {
    ……
}

 ここでは最初に右側「int i = 0」で変数であるiに初期値の0を設定しています。次に真ん中の「i <= 最大値」で変数iが最大値以下の場合と条件を設定しています。この条件がtrueの場合、for文の中に記述されている処理が実行されます。その処理が終わると、次に右の「i++」でカウンタである変数iを1増加します。その後、真ん中の条件から判定してtrueの場合は同じように処理を行い、falseの場合はfor文の処理を終了します。

 ちなみに、この変数「i」は定義されたfor文内のみ有効で、for文を抜けた後にはこの変数は使われなくなります。またfor文の外にすでに変数「i」が定義されている場合は、この変数名は使えないので注意してください。

 また、カウンタを使わずに、配列やCollectionのクラスなどの集合体に対してすべての要素を1つずつループ内で取得する場合にもfor文を使うことが可能です。その場合の書式は「拡張for文」と呼ばれ、次のようになります。

for ( 要素 : 集合体 ) {
    ……処理
}

 それでは次のサンプルを実行してみましょう。

package jp.codezine.java.sample03;

/**
 * for文のサンプルを実行し、その内容を確認するクラス。
 */
public class ForStatement {

    /**
     * for文を実行し、その内容を確認します。
     * 
     * @param args
     *            コマンドライン引数。今回は使われません。
     */
    public static void main(String[] args) {
        // [1] for文
        System.out.println("------- カウンタでのサンプル -------");
        String stringValue = "あいうえお";
        for (int i = 0; i < stringValue.length(); i++) {
            System.out.println("[1] " + stringValue.charAt(i));
        }

        System.out.println("------- 配列でのサンプル -------");
        char[] chars = stringValue.toCharArray();
        for (char charValue : chars) {
            System.out.println("[2] " + charValue);
        }
    }
}
実行結果:
------- カウンタでのサンプル -------
[1] あ
[1] い
[1] う
[1] え
[1] お
------- 配列でのサンプル -------
[2] あ
[2] い
[2] う
[2] え
[2] お

5.4. while文とdo-while文

 またfor文のほかにも繰り返し処理をする構文の一つにwhile文があります。while文の書式は次のようになります。

while ( 条件 ) {
    ……処理
}

 while文は、条件がtrueの間もしくは処理でbreakやreturnが呼ばれるまで、繰り返しの処理が行われます。

 また、while文とよく似た構文にdo-while文があります。do-while文の書式は次のようになります。

do {
    ……処理
} while ( 条件 )

 このdo-while文とwhile文の違いはdo-while文の条件の判定はdoの処理を行った後にされる点です。例えば次のようなwhile文とdo-while文のサンプルがあった場合、

// while文
int value = 0;
while (value < 0) {
    ……処理
}

// do-while文
value = 0;
do {
    ……処理
} while (value < 0);

 while文は判定が最初からfalseなので処理が実行されませんが、do-while文では最初にdoの処理が実行されます。

 それではサンプルを実行してみましょう。

package jp.codezine.java.sample03;

/**
 * while文およびdo-while文のサンプルを実行し、その内容を確認するクラス。
 */
public class WhileStatement {

    /**
     * while文およびdo-while文を実行し、その内容を確認します。
     * 
     * @param args
     *            コマンドライン引数。今回は使われません。
     */
    public static void main(String[] args) {
        // [1] while文
        System.out.println("------- [1] while文 -------");
        int value = 0;
        while (value < 3) {
            System.out.println("value は " + value);
            value++;
        }

        // [2] do-while文
        System.out.println("------- [2] do-while文 -------");
        value = 0;
        do {
            System.out.println("value は " + value);
            value++;
        } while (value < 3);

        // [3] 条件に一つもマッチしないwhile文
        System.out.println("------- [3] 条件に一つもマッチしないwhile文 -------");
        value = 0;
        while (value < 0) {
            System.out.println("value は " + value);
            value++;
        }

        // [4] 条件に一つもマッチしないdo-while文
        System.out.println("------- [4] 条件に一つもマッチしないdo-while文 -------");
        value = 0;
        do {
            System.out.println("value は " + value);
            value++;
        } while (value < 0);
    }
}
実行結果:
------- [1] while文 -------
value は 0
value は 1
value は 2
------- [2] do-while文 -------
value は 0
value は 1
value は 2
------- [3] 条件に一つもマッチしないwhile文 -------
------- [4] 条件に一つもマッチしないdo-while文 -------
value は 0

次のページ
最後に

この記事は参考になりましたか?

即戦力にならないといけない人のためのJava入門連載記事一覧

もっと読む

この記事の著者

長谷川 智之(株式会社ビーブレイクシステムズ)(ハセガワ トモユキ)

株式会社ビーブレイクシステムズ 開発部所属。社内サークルの執筆チームに在籍しています。主な執筆は下記になります。・@IT連載『Javaの常識を変えるPlay framework入門』※複数著者での連載 ・日経ソフトウェア連載『コツコツ学ぶAndroidネイティブアプリ開発教室』※複数著者での連載 ・@I...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7840 2015/07/27 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー