【Java初心者】while文とfor文~繰り返し処理~

while文の使い方とfor文の使い方、for文とwhile文の利用シーンの
違いについてソースコードや図を用いて具体的に説明をしていきます。

繰り返し処理(ループ処理とは)

繰り返し処理とは、ある条件を指定して
その条件が成立する間処理を繰り返し行うというものです。

繰り返し処理を行うイメージは以下の通りです。
条件式に対してyesの場合は条件内のブロックの処理を行い、
処理が終わると条件の前に戻って、
再び条件式に当てはまるかを確認することを繰り返します。

繰り返し処理のイメージ

繰り返し処理には大きく分けるとwhile文for文が存在します。
それぞれの使い方や使うシーンについて以降で詳しく説明していきます。

while文とは

while文は、「指定した条件に合致する間繰り返し処理を行う。」という処理です。

指定する条件には、整数/文字列/真偽値など様々な型のデータ型を用いることができ、
論理演算子や関係演算子を使用した式を用います。

while文には一般的なwhile文とdowhile文の2種類の形態が存在し、
それぞれ処理の順序や回数が変わってきます。

while文

while文は条件式の条件を最初に確認し、
条件がtrueであればブロック内処理を実行し、実行後に再び条件を確認します。
条件がfalseであればブロック内の処理を行わずそれ以降の処理に進む文です。

while(条件式) { 処理 };

while()と書いて()内に指定したい条件式を記載します。
その後ろに{}を書いて条件を満たした際に実行したい処理を書きます。

while文のイメージ

例えば以下のコードでは、aが0の際にwhile文の条件で0<=5が成立するため、
ブロック内の処理を行います。
ブロック内の処理を終えたらもう一度a<=5を確認し、
1<=5….と処理を繰り返してaの値が6になって
条件式が成立しなくなった際にwhile文を抜けます。

int a = 0;
while(a <= 5){      aが5以下の間繰り返す
a++;
}

他にも様々な条件式の使い方がありますが、なるべくシンプルに
パッと見た時にわかりやすい条件式を書くように心がけましょう!

while(a < 5){~     ⇦ aが5より小さい間繰り返し処理を行う
while(a != 5){~    ⇦aが5と等しくない間繰り返し処理を行う
while(a == b){      ⇦aとbが等しい間繰り返し処理を行う

dowhile文

dowhile文はブロック内の処理を最初に行った後に条件を確認する文です

do { 処理 } while(条件式);

上記のような書き方をします。
dowhile文が始まった際にはまずブロック内の処理を行います。
その後に条件式にて判定を行い、条件が成立するのであれば再度処理を行います。

dowhileのイメージ

例えば以下のコードでは、最初にブロック内処理を行うため、
一番最初の条件式は1<= 5から始まり、
条件式の部分で6<= 5の判定をするまで繰り返し処理を行います。

ブロックの前にあるdoは忘れてしまうといけないので、
最初に実行(do)するからブロックの前にdoをつけるとでも覚えておくといいでしょう。

int a = 0;
do{
    a++;
}while(a <= 5);

whileとdowhileの使い分け

whileとdowhileは、使える条件式の種類など基本的には同じですが、
決定的な違いは、最初の1回目に処理を実行するか否かという点です。

  • while文は、最初に条件式が成立しているかを判断するため、
    条件に合わない場合は1度もブロック内処理を行いません。
  • dowhile文は、最初に処理を行うため、
    条件に関係なく1度は必ずブロック内処理を行います。

以下のコードは、全く同じ条件の文ですが、
aの値は変化しませんがbの値は10から11に変化してしまいます。
dowhile文を使用すると意図しない値の変化が起きてしまって、
バグの原因になりかねないため、基本的にはwhile文を利用するようにしましょう。

int a = 10;
int b = 10;

while(a < 5){
a++;
}

do{
b++;                         ⇦最初に処理を実行してしまう
}while(b < 5);

条件に関係なく最初に1回だけ実行したい処理を書きたい場合は、
dowhile文を記載すると良いでしょう。
しかし、そのような場面に遭遇したらまず自分の設計が
間違っている
ことを真っ先に疑いましょう!!

for文とは

for文とは、指定した回数繰り返し処理を行うための文です。

状況に関わらず、とりあえず処理を〜回行いたい時に
for文を使えば指定した回数必ず繰り返し処理を行います。

for文のイメージ

for文にはfor文と拡張for文の2種類が存在します。

for文と拡張for文では活躍する場所が異なるため、
用法を理解して適材適所で使い分けるように心がけましょう。

for文

for文は、if文やwhile文のような条件式とは全く異なる、
回数を数えるためのfor文専用の式を使用します。

指定した回数の処理を行うために、
処理をするたびに回数を数えて次に進んでいきます。
以下がfor文の構成になります。

for(int i = 0; i < 10; i++){
  処理
}

初めてfor文に触れる方は意味がわからないと思いますので順に説明していきます。
for文の条件は以下の三つの処理から構成されています。

for文のコード

ループ変数宣言

最初の[int i = 0;]は、for文の処理を行った回数を数えるための変数を宣言しています。
ここで宣言した変数はfor文内の処理では利用可能ですが、
for文のブロックを通り抜けたあとは使用できませんので注意しましょう。

また、変数名は通常意味の通じるような名前をつける通例となっていますが、
ループ変数に限っては[i,j,k,l,m,n…]などアルファベット1文字が一般的に使用されています。

条件式

条件式は、while文やif文に使用している条件式と同様のものを使用します。
1つめに宣言したループ変数を使用してループする回数を指定します。
以下の例の他にも、<=や>=も使用できます。

  • i < 5 iが5より小さい間ループする
  • i > 5 iが5より大きい間ループする
  • i != 5 iが5と等しくない間ループする

回数のカウント

最後の[i++]はループした回数を数えることを意味します。
for文ブロック内の処理を終えた際にループ変数に1が加算され、
条件式の判断に移行します。

ほとんどの場合で、[i++]のインクリメントを使用しますが、
[i–]を記述することも可能となっております。

上記の3つから成るfor文ですが、基本的な型さえ覚えてしまえば、
あとは条件式の数字を変えるだけで好きな回数ループさせることが可能です。

以下のように同じ回数ループするfor文であっても、
様々な条件の指定方法がございます。

for(int i = 0; i < 10; i++){          ⇦10回処理を行う
処理
}
for(int i = 1; i <= 10; i++){          ⇦10回処理を行う
処理
}
for(int i = 0; i <= 9 i++){          ⇦10回処理を行う
処理
}

拡張for文

拡張for文は配列やリストの要素を使用して、先頭から順に処理を行う際に使用します。
逆にそれ以外の場合は普通のfor文を使用するという覚え方で問題ないでしょう。

拡張for文のコード

上記のような構成になっており、使う場面としては
配列の要素一つ一つを取り出して、
そのデータを使った処理を行う場面などになります。

以下のコードでは、int型の配列numbersの要素を使用するために
int型の変数を宣言し、for文の処理を1回行うごとにnumberには
numbersの0番目の要素から順に値が代入されていく仕組みとなっております。

int[] numbers = {1,2,3,4,5};
for(int number; numbers){
処理
}

while文とfor文の違い

while文とfor文はどちらも繰り返し処理を行う条件文ですが、
決定的な違いを挙げると以下の通りです。

  • 処理の回数を指定したい時には、for文を使用する。
  • 配列やリストの要素を扱いたい時には、拡張for文を使用する。
  • 複雑な条件式や回数に関係なく、
    条件によって繰り返し回数を決めたい場合には、while文を使用する。

まとめ

繰り返し処理は、場合によってはfor文とwhile文の
どちらを利用しても実現可能です。

しかし、余計な変数を新しく作ることになったり、
処理として回数を数えるなど、無駄なコードが発生してしまうため、
while文とfor文はそれぞれ利用できるシーンを見極めて両立していくことが望ましいでしょう!

以上、参考になった方もならなかった方もご覧いただきありがとうございました!