繰り返し処理の基本
繰り返し処理は、同じ作業を何度も実行したいときに使う仕組みです。
例えば、「こんにちは」と10回表示したいとき、System.out.println("こんにちは");を10回書くのは大変ですよね。繰り返し処理を使えば、数行で済みます。
ここでは、繰り返し処理が果たす役割や正しい終了条件の設定方法などについて学んでいきます。
繰り返し処理の役割
繰り返し処理の最大の利点は、書くコードの量を減らせることです。
例えば、10匹の動物の名前を表示したい場合を考えてみましょう。繰り返し処理を使わないとしたら、同じようなコードを10回書く必要があります。しかし、ループを使えば、わずか数行でこれが実現できるのです。プログラムが読みやすくなり、後から修正するときも楽になるという効果もあります。表示内容を変えたいとき、10箇所ではなく、1箇所だけ直せば済むのです。
ちなみに、繰り返し処理がよく使われるのは、次のようなケースです。
- 配列の全要素を処理するとき
- 指定回数だけ何かを実行するとき
- 特定の条件を満たすまで処理を続けるとき
それでは、実際にコードを見てみましょう。
出力結果
ネコ1匹目
ネコ2匹目
ネコ3匹目このプログラムでは、行数が少ないためあまり恩恵を感じないかもしれませんが、これが10行、100行となった場合はどうでしょうか?
i < 3の数字部分を変えるだけで繰り返す回数が簡単に変えられます。試しに値を変更して実行してみてください。
終了条件の考え方
繰り返し処理で重要なのは「いつ終わるか」です。終了条件が適切でないと、プログラムが永遠に止まらなくなってしまいます。これを「無限ループ」と呼びます。コンピューターが固まる原因になるので注意が必要です。
終了条件を正しく設定するには、ループの中で条件に関わる値が必ず変化するようにします。例えば、カウンタ用の変数を使う場合、その値をループ内で増やしたり減らしたりする必要があります。
また、条件式では等号(<、<=、>、>=)の使い方に注意しましょう。「3回繰り返したい」ときにi < 3とi <= 3では結果が違います。
出力結果
イヌが吠えています
イヌが吠えています
イヌが吠えていますこのプログラムでは、count++の行が重要です。
この行を忘れると、countが0のままで条件が常に真になり、無限ループになってしまいます。
Javaで使える主なループ構文一覧
Javaには主に3種類の繰り返し構文があります。
for文は、回数が決まっているときに便利です。
「初期化」、「条件判定」、「値の増減処理」を1行でまとめて書けるため、コードが整理されます。
while文は、回数が事前に決まっていないときに有用です。
「条件を満たしている間だけ実行する」という動きをします。
do-while文は、while文とほぼ同じですが、最初に必ず1回は処理を実行してから条件をチェックするという点が違います。
それぞれの特徴を理解して、処理の内容に応じて使い分けることが大切です。
出力結果
ウサギ跳び
ウサギ跳び
カエル跳び
カエル跳びこの例では、for文とwhile文で同じような結果が得られているのが確認できますね。
for文は繰り返し回数が明確なとき、while文は条件によって回数が変わるときに向いています。
for文による回数指定の基礎
for文は、繰り返す回数があらかじめわかっているときに最適な構文です。例えば、「5回繰り返したい」とか「配列の全要素を処理したい」といったような場合です。
繰り返しに必要な処理を1行にまとめて書けるので、コードがすっきりして見やすくなるという利点もあります。
ここでは、for文の基本的な仕組みから、実践的な使い方までくわしく解説します。
for文の基本構造
for文は「for (初期化; 条件式; 増減式)」という形で書きます。
初期化ではカウンタ用の変数を設定し、条件式でループを続ける条件を指定し、増減式でカウンタ変数を変化させます。
処理の流れを確認しておきましょう。
- 最初に、初期化を1回だけ実行する
- 次に条件式をチェックしてtrueなら処理を実行する
- 増減式を実行し、再び条件式をチェックする
- 条件式に当てはまらなくなった時点でループが終了する
出力結果
1回目:トラが歩いています
2回目:トラが歩いています
3回目:トラが歩いていますこのプログラムでは、iが1から始まり、3以下の間は繰り返されます。
i++によって毎回1ずつ増えるため、1、2、3と順番に処理が実行されます。
回数指定ループの書き方
指定した回数だけ繰り返す場合、一般的には0から始めて「回数未満」という条件を使います。
例えば5回繰り返したい場合はi < 5と書きます。このとき、iは0から4まで変化するので、合計5回実行されます。この書き方はプログラミングの慣習として広く使われています。
カウンタ変数の値を表示に使う場合は、i + 1のように調整するのが一般的です。配列のインデックスは0から始まりますが、人間が見る番号としては1から始まる方が自然だからです。
出力結果
ペンギンが1歩進みました
ペンギンが2歩進みました
ペンギンが3歩進みました
ペンギンが4歩進みましたこの例では、繰り返し回数を変数に格納しています。
このプログラムはシンプルなため、あまり意味を見出せないかもしれませんが、実際の複雑なプログラムになると、変数を格納することのメリットが際立ってきます。
もし、プログラムの中で「ペンギンが歩く」処理以外にも、同じ回数をループで繰り返したい処理が複数箇所あったとします。そういった場合、後から回数を変更する際に1箇所を修正するだけで済むのです。
また、4という数字が何を意味するのか、コードを見ただけではわかりません。
しかし、repeatCount という意味のある名前の変数を介することで、その数字が「繰り返し回数」を表していることが明確になります。
このように、変数として格納するのは、コードの保守性(メンテナンスのしやすさ)と可読性(読みやすさ)という観点で非常に重要なので、覚えておきましょう。
インデックス操作のポイント
for文のカウンタ変数は、配列やリストのインデックスとしても活用できます。ここで注意が必要なのが「オフバイワンエラー」です。
オフバイワンエラーとは、配列やループ処理において、要素の数やインデックスの範囲を1つ間違えることによって発生するエラーの総称です。
これは、プログラミング初心者だけでなく、経験者でもうっかり犯しやすいミスで、「インデックスが0から始まる」という事実と、「私たち人間の数え方(1から始まる)」との間のズレが原因で生じます。
配列のインデックスは0から始まるため、長さがnの配列では有効なインデックスは0からn-1までです。
つまり、要素数より一つ少ない値になるので注意しましょう。
そのため、条件式ではi < array.lengthのように書きます。i <= array.lengthにすると存在しない要素にアクセスしようとしてエラーになります。
人間が理解しやすい番号として表示する場合はi + 1を使い、配列へのアクセスにはiをそのまま使いましょう。
出力結果
1番目の動物:ライオン
2番目の動物:ゾウ
3番目の動物:キリンこの例では、animals.lengthで配列の長さを取得し、それを条件に使っています。
表示では(i + 1)で人間にわかりやすい番号にしていますが、配列へのアクセスはanimals[i]のように記述しています。
while文による条件指定ループ
while文は、特定の条件が満たされている間だけ処理を繰り返す構文です。
繰り返し回数が事前に決まっていない場合に適しています。
例えば、ユーザーの入力によって処理を制御したい場合などがその代表格です。「正しい値が入力されるまで繰り返す」という処理が必要になるからです。
ここでは、while文の基本的な使い方と、注意すべきポイントについて解説します。
なお、以下の記事でもwhile文について詳しく解説しています。
【関連】Javaのwhile文を基本から実践まで初心者向けにわかりやすく解説
while文の基本構造
while文は「while (条件式)」という形で書きます。
条件式でループを続ける条件を指定し、条件がtrueの間は処理を繰り返します。for文とは違って、初期化や増減処理は別途記述する必要があります。
処理の流れは、次の通りです。
- 最初に、条件式をチェックしてtrueなら処理を実行する
- 処理が終わったら、再び条件式をチェックする
- 条件式がtrueの間、この繰り返しを続ける
- 条件式に当てはまらなくなった時点でループが終了する
なお、最初から条件式がfalseの場合、処理は1回も実行されません。
出力結果
サルが1回ジャンプしました
サルが2回ジャンプしました
サルが3回ジャンプしましたこのプログラムでは、countが1から始まり、3以下の間は繰り返されます。
ループ内でcount++によって値が増えるため、最終的に条件が満たされなくなってループが終了します。
無限ループと終了条件設定
while文で最も注意すべきなのは、無限ループの発生です。
条件式に関わる変数がループ内で変化しない場合、条件が常にtrueのままになり、プログラムが永遠に止まらなくなってしまいます。例えば、カウンタ変数を増やす処理を書き忘れると、このような状態になります。
終了条件を正しく設定するには、ループ内で条件に関わる変数を必ず更新します。更新処理は処理ブロックの最後に配置すると、書き忘れを防ぎやすくなります。
いつかは必ず条件式がfalseになるよう設計することが重要です。
出力結果
ウマが走っています(体力:5)
ウマが走っています(体力:4)
ウマが走っています(体力:3)
ウマが走っています(体力:2)
ウマが走っています(体力:1)
ウマが疲れて休憩していますこのプログラムでは、energy--で体力を1ずつ減らしています。
この処理がないと、体力が5のまま変わらず、条件が常にtrueとなり、無限ループになってしまいます。
ユーザー入力とwhile文の組み合わせ
while文は、ユーザーから正しい入力を受け取るまで繰り返し質問する処理に適しています。
例えば、「1~10の数字を入力してください」という場面で、ユーザーが「100」や「-5」を入力した場合、正しい値が入力されるまで何度でも聞き直す必要があります。
このような「何回繰り返すか事前にわからない」処理では、while文が便利です。
while文を使えば、条件を満たさない入力があったときに再度入力を促し、ユーザーが正しい値を入力した時点でループが自然に終了します。
繰り返し処理と文字列・入力処理の実践活用
繰り返し処理は、文字列操作やユーザー入力の処理で特に力を発揮します。
「1文字ずつ調べる」
「入力値が正しいかチェックする」
「複数のデータをまとめて処理する」
といったように、実際の開発でよく遭遇します。
ここからは、実践的な活用方法を具体例とともに学んでいきましょう。
文字列操作とループの活用例
文字列を1文字ずつ処理したいとき、for文と文字列のメソッドを組み合わせて使います。
length()メソッドで文字列の長さを取得し、charAt()メソッドで指定した位置の文字を取り出せます。こうすることで、特定の文字を数えたり、文字列の内容を分析したりできます。
文字列の長さをfor文の条件に使い、各インデックスの文字を順番に処理していきます。この方法は、文字列の検索や変換処理でよく使われる基本的なテクニックです。
出力結果
1文字目:ネ
2文字目:コ
3文字目:イ
4文字目:ヌ
5文字目:ウ
6文字目:サ
7文字目:ギ
「ネ」「コ」の文字数:2文字この例では、文字列を1文字ずつ取り出して表示し、さらに「ネ」と「コ」の文字が何個あるかを数えています。
charAt(i)で各位置の文字を取得し、条件に合致する場合にカウンタを増やしています。
複数データの処理とイテレーション
配列やリストに格納された複数のデータを順番に処理する場合、for文を使って各要素にアクセスできます。
配列の場合はlengthプロパティで要素数を取得し、リストの場合はsize()メソッドを使います。
ちなみに、イテレーションとは、このようにデータの集まりを1つずつ順番に処理していくことを指します。
出力結果
パンダ:3文字
コアラ:3文字
カンガルー:5文字
ラッコ:3文字
動物名の合計文字数:14文字このプログラムでは、配列に格納された動物名を1つずつ取り出し、それぞれの文字数を表示しています。
さらに、totalLengthという変数に各動物名の文字数を加算することで、合計文字数を計算しています。
よくある質問(Q&A)
Q: for文のカウンタは必ず0から始める必要がありますか?
A: いいえ、その必要はありません。カウンタは任意の値から開始できます。例えば
のように1から始めることも可能です。配列処理では0から始めることが多いですが、用途に応じて適切な開始値を選択してください。
Q: while文で条件式にtrueと書くとどうなりますか?
A: 「while(true)」と記述すると無限ループになります。この場合、ループ内でbreakステートメントを使って明示的にループを抜ける処理を記述する必要があります。条件が複雑な場合に使われることがありますが、初心者の方は通常の条件式を使うことをお勧めします。
Q: ネストしたループ処理は避けるべきですか?
A: 必要に応じて使用して構いません。二次元配列の処理や、複数の組み合わせを調べる処理では必要になります。ただし、深くネストしすぎるとプログラムが複雑になるため、3層以上のネストは避けることを心がけてください。
出力結果
シマウマ(0,0)
シマウマ(0,1)
シマウマ(1,0)
シマウマ(1,1)Q: ループ内で配列の要素を変更しても大丈夫ですか?
A: 大丈夫です。for文やwhile文の中で配列の要素を変更することは問題ありません。ただし、ループの条件に影響する値を変更する場合は、意図しない動作を起こさないよう注意が必要です。変更前後の値を確認しながら処理を進めることをおすすめします。
まとめ
繰り返し処理は、同じ処理を何度も書く手間を省き、コードをシンプルに保つことができる便利な機能です。
この記事で学んだ重要なポイントを振り返りましょう。
繰り返し処理の重要なポイント
-
for文は回数指定に最適
初期化・条件・増減処理を1行で記述でき、回数が明確な処理に向いています。 -
while文は条件指定に最適
条件式だけで制御するため、回数が事前にわからない処理に適しています。 -
終了条件の設定が重要
ループ内で条件に関わる変数を必ず更新しないと、無限ループになってしまいます。 -
インデックス操作が重要
lengthを使って要素数を取得し、インデックスで各要素に順番にアクセスできます。 -
入力チェックに活用
ユーザーが正しい値を入力するまで繰り返すような処理で威力を発揮します。
初心者の方が特に注意すべき点は、オフバイワンエラーと無限ループです。配列のインデックスは0から始まることを意識し、ループ内で必ず終了に向かうように設計しましょう。
実際の開発では、文字列の1文字ずつの処理、入力値の検証、配列やリストの全要素処理など、さまざまな場面で繰り返し処理を使います。
この記事で学んだ基本をしっかり身に付けて、実践的なプログラムに活かしていきましょう。