【独学】はじめてのAndroidプログラミング – 4.6 Java言語の基礎(制御の流れ)

Java言語では条件に応じて処理を分岐する条件分岐処理や、ある条件のもとで処理を繰り返す繰り返し処理が可能になります。ここでは、if文、switch文、while文、do-while文、for文について学習します。

カリキュラムのサンプル コードは、「Javaコードの実行」に示す手順で実行して確認できます。

if文

条件式を評価した結果に応じて、処理を分けたい場合に使われるのがif文です。条件式の評価結果は boolean型かBoolean型となり、条件式がtrueの場合に処理が実行されます。条件式がfalseの場合、処理は実行されません。単純な条件の式から演算を組み合わせた複雑な条件の式まで記述できるので広い範囲で利用できます。

次の例では、最初に条件式①「val > 90」を評価し、 「true」であれば直後のブロック内の処理「statement1」を実行し if 文を終了します。条件式①が「false」だった場合に、条件式②「val > 70」を評価します。条件式②「val > 70」が「true」だった場合は、直後のブロック内の処理「 statement1 」を実行し if 文を終了します。同じように必要なだけ条件式を記述して「true」だった場合のブロックを記述できます。最後にすべての条件式が false だった場合に、「else」のあとのブロック内の処理「statement3」を実行します。

int val = 74;
if (val > 90){           // 条件式①
    /* statement1 */ 
}else if (val > 70) {    // 条件式②
    /* statement2 */ 
}else{                   // 条件式③
    /* statement3 */ 
}

注意点として、条件式②が評価されるのは条件式①が「 false」の場合のみとなります。条件式①が「 true 」だった場合は、それ以降の条件式は評価されません。

switch文

switch文は対象の式を評価した結果の値に応じ、値に一致するラベルの位置へ処理を移すために使います。条件分岐とは厳密には少し違いますが同じような使い方ができます。switch文の式として使用できるのは、整数型かそのラッパークラス、文字列になります。

switch 文では最初に式を評価します。そしてcaseの後に記述されたラベルの値と一致したものがあった場合に、対応するラベルの位置へ処理を移します。break文を実行するとswitch文を終了します。また、どのラベルにも当てはまらなかった場合に、defaultが記述されていれば、defaultの位置の処理が動くようになっています。defaultが記述されていなければ、switch文を終了します。

switch 文で変数「val」を評価し、値が「10」または「20」または「30」だった場合に、case の後に記述された対応するラベルの位置へ処理を移動します。次に示すJavaコードでは変数「val」が「10」なので、ラベル「10」の位置へ移動したあと何もしないで、 break文でswitch文を終了します。

int val = 10;
int val2;
switch (val) {   // 条件式
  case 10:
    break; // 何もしない (switch ブロックを抜けるために break する必要がある)
  case 20:
    val2 = 20;
    // FALLTHROUGH (break (あるいは return など) がなければ switch ブロックを抜けずに下に進む)
  case 30:
    val += 10;
    break;
  default: // default ラベルはなくてもよい
    // ...
}

上記のJavaコードでは、変数「val 」の値によって次のように処理が行われます。

  • 変数「val」が「20」の場合、ラベル「20」の位置へ移動して変数「val2」に「20」を設定し、break文がないので、変数「val 」に「10」を加算して、 break文でswitch文を終了
  • 変数「val」が「30」の場合、ラベル「30」の位置へ移動して、変数「val」に「10」を加算して、 break文でswitch文を終了
  • 変数「val」が「40」の場合、対応するラベルがないのでdefaultの位置へ移動して、何も処理を行わずにswitch文を終了

while文

while文は、条件が満たされている間は何度でもループ処理を実行する目的で利用されます。

while文では条件式を評価し、trueだった場合には「{」から「}」のブロック内に記述された文を実行します。

次に示すJavaコードでは条件式「val < 10」を評価し、「10」より小さい場合は変数「val」に「1」を加算し、「10」より大きいか等しい場合はwhile文を終了します。

int val = 0;
while (val < 10) {    // 条件式
    val++;
}
//  val = 10

do-while文

do-while文は、条件判定される前に1度処理が実行され、その後条件が満たされている間は何度でもループ処理を実行する目的で利用されます。

do-while文では、まず一回目の繰り返し処理として「{」から「}」のブロック内に記述された処理を上から順番に実行したあと、条件式「val < 10」を評価して、 trueだった場合には「{」から「}」のブロック内に記述された文を実行します。

次に示すJavaコードでは、最初に変数「val」に「1」を加算し、条件式「val < 10」を評価して「10」より小さい場合は変数「val」に「1」を加算し、「10」より大きいか等しい場合はwhile文を終了します。

int val = 0;
do {
    val++;
} while (val < 10);    // 条件式
//  val = 10

for文

for文は、指定した回数だけ処理を繰り返す時に使われます。for文は次のように、初期化式、 条件式、 変化式を持ちます。

for (初期化式; 条件式; 変化式){

初期化式は、 for 文が実行されるときに最初の一回だけ実行されます。条件式で使用する変数の初期化などに使用されます

条件式は、評価されて true だった場合、繰り返し処理「{」から「}」のブロック内に記述された処理を上から順番に実行し、 false だった場合には繰り返し処理を終了し for 文を終了します。

変化式は、繰り返しが一度実行されて、ブロックの最後まで到達すると一回評価されます。この変化式で条件式で使用している変数の値を変換させます。

次のJavaコードは次のように実行します。

  1. 変数「val」の宣言と初期化(val = 0)
  2. 初期化式で変数「i」の宣言と初期化(i = 0)
  3. 条件式「i < 10」は true なので繰り返しを実行
  4. ブロック内の処理を実行(変数「val」に変数「i」を加えて変数「val」に保存)
  5. 繰り返しの1回目終了
  6. 変化式で変数「i」に格納されている値を「1」増加(i = 1)
  7. 条件式「i < 10」はtrueなので繰り返しを実行
  8. ブロック内の処理を実行(変数「val」に変数「i」を加えて変数「val」に保存)
  9. 繰り返しの2回目終了
  10. 変化式で変数「i」に格納されている値を「1」増加(i = 2)
  11. 以降項目6から項目10までを8回繰り返し、変数「i」が「10」になる
  12. 条件式「i < 10」はfalseなので繰り返しを終了
int val = 0;
for (int i = 0; i < 10; ++i) {    // 条件式
    val += i;
}
//  val = 45

拡張された for文(for-each文) もあります。for-each文は、for文とは異なり条件式がありません。対象となる配列の要素の数だけ繰り返します。

配列から要素を一つ取りだし変数に格納します。その後 「{」から「}」のブロック内に記述された処理を実行します。次に、次の要素を取り出して変数に格納し、再度ブロック内の処理を実行します。要素をすべて取り出すと繰り返し処理は終了します。

次のJavaコードは次のように実行します。

  1. 配列「nums」の宣言と初期化(val = 0)
  2. 配列「nums」から要素を取り出し変数nに格納する(n=0)
  3. ブロック内の処理を実行(画面に変数nの値を出力)
  4. 繰り返しの1回目終了
  5. 以降、配列「nums」から要素を順次取り出し、変数nに格納して(2回目:n=10、3回目:n=20、4回目:n=30、)ブロック内の処理を実行
  6. 4回目が終了すると、配列「nums」から要素をすべて取り出したのでfor-each文を終了
int[] nums = { 0, 10, 20, 30 };
for (int n : nums) {    // 条件式
    System.out.println(n);
}
/*
0
10
20
30
*/

break文とラベルの有無

break文は、switch文、while文、do-while文、for文のブロック内で使用され、break文が実行されるとブロックを抜けて次の処理へ移ります。

ラベルなしbreak文

ラベルなしの break文 は、最も内側の switch文、while文、do-while文、for文を抜けます。 なお、switch文、while文、do-while文、for文の文の中でしか使用できません。

次のJavaコードは次のように実行します。

  1. 初期化式で変数「val」の宣言と初期化(val = 0)
  2. 条件式「val < 10」は true なので繰り返しを実行
  3. ブロック内の処理を実行し、条件式「val == 5」は false なので、「System.out.println(val)」により変数「val」の値を表示
  4. 繰り返しの1回目終了
  5. 変化式で変数「val」に格納されている値を「val」増加(val = 1)
  6. 条件式「val < 10」はtrueなので繰り返しを実行
  7. ブロック内の処理を実行し、条件式「val == 5」は false なので、「System.out.println(val)」により変数「val」の値を表示
  8. 繰り返しの2回目終了
  9. 以降項目5から項目8までを3回繰り返す
  10. 変化式で変数「val」に格納されている値を「val」増加(val = 5)
  11. ブロック内の処理を実行し、条件式「val == 5」はtrueなので、break文が実行されてfor文を終了
for (int val = 0; val < 10; val++) {    // 条件式
    if (val == 5) {
        break;
    }
    System.out.println(val);
}
/*
0
1
2
3
4
*/

ラベル付きbreak文

文にはラベルを付けることができ、ラベル付でbreak文を使用することもできます。 ラベル付break文は、ラベルが付けられた文を抜けます。ラベルは、ラベルなしbreak文によって抜けることができる種類の文以外にも付けることができます。

次のJavaコードは次のように実行します。

  1. ラベル「LABEL1」が付与されたfor文の初期化式で変数「val」の宣言と初期化(val = 0)
  2. 条件式「val < 10」は true なので繰り返しを実行
  3. ブロック内の処理を実行し、条件式「val == 5」は false なので、「System.out.println(val)」により変数「val」の値を表示
  4. 繰り返しの1回目終了
  5. 変化式で変数「val」に格納されている値を「val」増加(val = 1)
  6. 条件式「val < 10」はtrueなので繰り返しを実行
  7. ブロック内の処理を実行し、条件式「val == 5」は false なので、「System.out.println(val)」により変数「val」の値を表示
  8. 繰り返しの2回目終了
  9. 以降項目5から項目8までを3回繰り返す
  10. 変化式で変数「val」に格納されている値を「val」増加(val = 5)
  11. ブロック内の処理を実行し、条件式「val == 5」はtrueなので、ラベル付break文が実行されてラベル「LABEL1」が付与されたfor文を終了
LABEL1:
for (int val = 0; val < 10; val++) {    // 条件式
    if (val == 5) {
        break LABEL1;
    }
    System.out.println(val);
}
/*
0
1
2
3
4
*/

continue文とラベルの有無

continue文はbreak文と同じくwhile文、do-while文、for文のブロック内で使用され、continue文が実行されると実行された位置からブロックの最後まで残りの処理をスキップします。

ラベルなしcontinue文

ラベルなしの continue文 は、ループ中 (while文、do-while文、for文) でのみ使用できます。ラベルなしcontinue文では最も内側のループの最後に制御が移ります。

次のJavaコードは次のように実行します。

  1. 初期化式で変数「val」の宣言と初期化(val = 0)
  2. 条件式「val < 10」は true なので繰り返しを実行
  3. ブロック内の処理を実行し、条件式「val == 5」は false なので、「System.out.println(val)」により変数「val」の値を表示。
  4. 繰り返しの1回目終了
  5. 変化式で変数「val」に格納されている値を「val」増加(val = 1)
  6. 条件式「val < 10」はtrueなので繰り返しを実行
  7. ブロック内の処理を実行し、条件式「val == 5」は false なので、「System.out.println(val)」により変数「val」の値を表示
  8. 繰り返しの2回目終了
  9. 以降項目5から項目8までを3回繰り返す
  10. 変化式で変数「val」に格納されている値を「val」増加(val = 5)
  11. ブロック内の処理を実行し、条件式「val == 5」はtrueなので、continue文が実行されてfor文の条件式に移動し、条件式「val < 10」を評価
  12. 条件式「val < 10」は true なので繰り返しを実行
  13. 以降、項目5から項目8までを4回繰り返し、変数「val」が「10」になる
  14. 条件式「val< 10」はfalseなので繰り返しを終了
for (int val = 0; val < 10; val++) {    // 条件式
    if (val == 5) {
        continue;
    }
    System.out.println(val);
}
/*
0
1
2
3
4
6
7
8
9
*/

ラベル付きcontinue文

ラベル付きcontinue文は、指定のラベルが付けられたループの最後に制御が移ります。 ラベルはループに付ける必要があります。

次のJavaコードは次のように実行します。

  1. ラベル「LABEL1」が付与されたfor文「for文①」の初期化式で変数「val」の宣言と初期化(val = 0)
  2. ラベル「LABEL1」が付与されたfor文「for文①」の条件式「val < 3」は true なので繰り返しを実行
  3. for文「for文②」の初期化式で変数「val1」の宣言と初期化(val1 = 0)
  4. 条件式「val1 < 3」は true なので繰り返しを実行。ここでfalseになるとfor文を終了
  5. ブロック内の処理を実行し、条件式「val1 == 1」は false なので、「System.out.println(val)」により変数「val」の値を表示
  6. 繰り返しの1回目終了
  7. 変化式で変数「val1」に格納されている値を「val1」増加(val1 = 1)
  8. 条件式「val1 < 3」はtrueなので繰り返しを実行
  9. ブロック内の処理を実行し、条件式「val1 == 1」は true なので、continue文が実行されてラベル「LABEL1」が付与されたfor文「for文①」の条件式に移動し、変化式で変数「val1に格納されている値を「val」増加(val = 1)
  10. ラベル「LABEL1」が付与されたfor文「for文①」の条件式「val < 3」は true なので繰り返しを実行
  11. 以降、項目3から項目10を2回繰り返し、変数「val」が「3」になる
  12. ラベル「LABEL1」が付与されたfor文「for文①」の条件式「val < 3」が false なので繰り返しを終了
LABEL1:
for (int val = 0; val < 3; val++) {           // for文①
    for (int val1 = 0; val1 < 3; val1++) {    // for文②
        if (val1 == 1) {
            continue LABEL1;
        }
        System.out.println(val + " " + val1);
    }
}
/*
0 0
1 0
2 0
*/

return文

return文は、メソッドの実行を終了させて、呼び出し元に制御を戻します。

return;

通常、メソッドは最後まで処理を行うと呼び出し元に処理が戻るため、条件によって途中で処理を中断する場合などに使われます。

次のJavaコードは次のように実行します。

  1. 既存メソッド「onCreate」に追加したメソッド「sample」をパラメータ「0」で呼び出す
  2. 呼び出されたメソッド「sample」は、パラメータ「num1」(=0)をif文で判断する
  3. 条件文「num1 == 0」を評価すると結果がtrueなので、「returnで戻ります。」を表示して、return文によりメソッド「main」に戻る
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sample(0)   // 追加する
}


void sample(int num1) {
    if (num1 == 0) {  // 条件文
        System.out.println("returnで戻ります。");
        return;
    }
    System.out.println("sampleは終了しました");
}
//  returnで戻ります。

メソッドとは?

特定のクラスやオブジェクトに所属するグループのことです。 内容がまとまっている処理や反復する処理など、いくつかの処理を一つにまとめたものをメソッドと呼びます。 メソッド については、カリキュラム「4.7 Java言語の基礎(クラスとオブジェクト)」で詳細に説明します。

戻り値を持つreturn文

メソッドが戻り値型を持っていれば、その型に代入可能な型の式をreturn文によって返す必要があります。呼び出し側のメソッドは処理した結果を戻り値として受け取ることができます。

return 戻り値;

次のJavaコードは次のように実行します。

  1. 既存メソッド「onCreate」に追加したメソッド「sample」をパラメータ「10」で呼び出す
  2. 呼び出されたメソッド「sample」は、パラメータ「num1」(=10)をreturn文で戻す
  3. メソッド「main」は、メソッド「sample」からの戻り値を変数「i」に保存して、変数「i」の内容「10」を表示する
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 追加する
    int i = sample(10);
    System.out.println(i);   // 10
}
int sample(int num1) {
    return num1;
}

本節の説明は以上になります。

タイトルとURLをコピーしました