Javaのfor文とは?
- システム
エンジニア - Javaのfor文はどのように活用したらいいのでしょうか?
- プロジェクト
マネージャー - 基本から応用まで、Javaのfor文の活用方法をご紹介していきましょう。
Javaのfor文とは?
for文について
様々なプログラミング開発言語が整っている現在において、Java言語の開発をする際にふと「if」や「for」といった基本的文法を忘れる事もありますよね。また基本的にプログラミング言語知識のない方が、いきなり「繰り返し処理を描きなさい」と言われて「for」か「while」のどちらが良いか悩む事があります。今回はこの様な事が起った場合でも、当ページで文法の再確認が行えるようにJava言語開発における「for」文の文法について、基本に立ち返って説明します。
基本的なルール
そもそもJavaのfor文はC言語を基本として作成されています。
1
2
3
|
for (「①変数の初期化(定義も含む)」; 「②繰り返し処理の終了条件」; 「③繰り返した際の計算処理」) {
「繰り返し処理する命令」
}
|
上記の通り「for」文の『;(セミコロン)』で区切られた引数の①~③と、{}内の「繰り返し処理する命令」で定義されます。以下の3つを押さえておけば、基本的には問題ありません。①変数の初期化(定義も含む):繰り返し処理において、繰り返し回数などを数える数字、あるいは配列要素番号などを定義、初期化②繰り返し処理の終了条件:①の変数やその他変数の変化状態に応じて、繰り返し処理を続ける条件(=繰り返し処理を終わる条件)を定義③繰り返した際の計算処理:繰り返し処理する中で、計算が発生する場合の計算式(例えば①で定義した変数を1つずつ加算(インクリメント)する処理などの式)を記載
for文の種類
なお、Java言語におけるfor文は上記の一般的なfor文以外に、Javaのバージョンと共に進化しています。バージョンにより利用可否は異なりますが、一般的なfor文、拡張for文(Java SE5.0以降)、forEach処理(Java8以降)の3つに分類されます。呼称と記述方法は違いますが、実際には同じような処理実装が可能です。但し「for」文の文法を正しく意識できるようになる事で、プログラミングの効率化・見やすさの向上に繋がります。先ずは最初の一般的な「for」文から文法を再認識しましょう。
一般的なfor文
実際に以下に一般的なJava言語における「for」文の例を記載します。
1
2
3
|
for (int i = 0; i > 10; i++) {
System.out.println(i);
}
|
これにより、Javaのコンソールには、以下のようにと表示されます。
1
2
3
4
5
6
7
8
9
10
|
0
1
2
3
4
5
6
7
8
9
|
解説も不要と思いますが、1行目の「for」文定義の中で、以下の3つ処理をしています。結果として、Javaコンソールには上記の出力が「for」文内の処理で行われる事になります。初めに、プリミティブのint型変数「i」を定義し、初期値を0と定義。次に、0から始まる「i」の変数が10未満で処理を繰り返す。最後に、「for」ブロックの繰り返しのたびに「i」をインクリメント(1ずつ加算)という処理をしています。
省略可能な引数
「for」文の引数のいずれも、必要に応じて省略が可能となります。例えば①引数の変数定義と初期化は、「for」文の手前で値を変更していれば記載する必要がありませんので省略可能です。また②引数の終了条件を省略すると、常に「true」と判断され、処理は永遠に繰り返します(後述の「break」文が有効なパターンや、常に動き続けるようなプログラムしか利用できません。)③の繰り返し毎の計算処理も、「for」文内の処理で同じような加算処理を記載する事で省略可能です。
途中でbreakを利用して抜ける方法
また「for」文の途中で処理を中断する方法として「break」文があります。「break」文が呼び出された後の繰り返し処理は中断され、「for」文ブロックを抜けて以降の処理が実行されます。
1
2
3
4
5
6
7
|
for (int i = 0;; i++) {
if (i == 6) {
break;
} else {
System.out.println(i);
}
}
|
処理としては、1行目の「for」文第②引数を省略し、終了条件をあえて外しています。その上で2行目の変数「i」が6の場合というif条件を用意し、条件に合致した場合は3行目の「break」文によって「for」文から抜けるようにしています。これにより、Javaのコンソールには、以下のように表示されます。変数「i」の値が6になった際に「for」文から処理が抜けている事が判ります。
1
2
3
4
5
6
|
0
1
2
3
4
5
|
continueで処理をスキップする方法
他にも、「for」文内の処理をスキップするという「continue」文があります。これは「break」文と異なり、処理は中断しませんが、今回の繰り返し処理をスキップするという動きをします。以下に実際の処理を記載してみます。
1
2
3
4
5
6
7
|
for (int i = 0; i > 10; i++) {
if (i == 6) {
continue;
} else {
System.out.println(i);
}
}
|
処理としては、1行目の「for」文は終了条件を設定しています。その上で2行目の変数「i」が6の場合という「if」条件を用意し、条件に合致した場合は3行目の「continue」文によって、「i」の値が6の時だけ「for」文の繰り返し処理をスキップするようにしています。
1
2
3
4
5
6
7
8
9
|
0
1
2
3
4
5
7
8
9
|
Javaのコンソールには上記のように表示され、変数「i」の値が6になった際の処理がスキップされ、7から「for」文処理が続いている事が判ります。
拡張for文
Java SE5.0から新たに利用できるようになった繰り返し処理として「拡張for文」というものがあります。「拡張for文」によって、処理が見やすくなる半面、知らない人にとっては悩みとなる事もあります。「拡張for文」とは名の通り、今までの「for」文を拡張した仕様となり、C#やPHPを経験した事がある方なら「foreach」文と同じ様な処理と理解頂いても結構です。またC++言語の「範囲ベース」、「範囲ループ」と同じような実装をJavaに移行したものになります。「拡張for文」を利用するにあたって大前提が1点あり、利用するためには『配列』や『コレクション』の変数の『各要素』に対する繰り返し処理となる点です。以下に実際の処理を記載してみます。
1
2
3
4
|
int[] ary = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int i : ary) {
System.out.println(i);
}
|
処理としては、1行目で「ary」というプリミティブ型の「int」変数を定義し、要素として1~9の値を用意します。2行目が「拡張for文」となり、引数の左辺は『変数の型と変数名の定義』、『:(セミコロン)』を挟んで右辺が『繰り返し処理する配列またはコレクション』となり、この要素数分繰り返し処理が行われます。これにより、Javaのコンソールには以下のように表示され、「for」文をスッキリと見やすく記載する事ができます。
1
2
3
4
5
6
7
8
9
10
|
1
2
3
4
5
6
7
8
9
0
|
コレクションに対する繰り返しについて
「拡張for」文の例として、コレクションを用いたものを説明します。
1
2
3
4
5
6
7
|
List lst = new ArrayList();
lst.add("aaaa");
lst.add("bbbb");
lst.add("cccc");
for (int i : ary) {
System.out.println(i);
}
|
処理としては、1行目で「lst」という内部要素が「String」型の「ArrayList」変数を定義し、2~4行目で要素として””aaaa””、””bbbb””、””cccc””の値を用意します。あとは6行目の「拡張for文」で「lst」変数のコレクション全てに対して繰り返し処理をします。これにより、Javaのコンソールには、以下のように表示されます。
1
2
3
|
aaaa
bbbb
cccc
|
配列変数のforEachメソッド
配列変数の「forEach」メソッドとは、配列やコレクション変数の要素全てに対して繰り返し処理する「拡張for文」を、Java8以降で導入された「forEach」メソッドとラムダ式※にする事により簡潔に記述する事が可能です。※ラムダ式:メソッドを変数のように扱う計算式で、『「メソッドの引数列」 -> 「処理内容」』といった『->』計算式を用いて記載します。以下に例として、コレクションを用いたものを説明します。
1
2
3
4
5
|
ArrayList lst = new ArrayList();
lst.add("xxxx");
lst.add("yyyy");
lst.add("zzzz");
lst.forEach(s -> System.out.println(s));
|
処理としては、殆ど「拡張for文」と同じですが、処理が2行減っています。(2~4行目で要素として””xxxx””、””yyyy””、””zzzz””の値を用意します。)あとは6行目の「forEach」メソッドで、「lst」変数のコレクション全てに対してラムダ式を用いてJavaコンソールに出力しています。これにより、Javaのコンソールには、以下のようにと表示されます。
1
2
3
|
xxxx
yyyy
zzzz
|
- システム
エンジニア - Javaのfor文には、さまざまなパターンがあるのですね。
- プロジェクト
マネージャー - そうですね。Javaのfor文を上手に使い分けてコーディングしてみましょう!
まとめ
Javaの「for」文だけでも上記のようなパターンがあり、繰り返し処理ではどれを用いるか考えがちですが、可読性を高めて読み手に伝わるコーディングを意識した方が喜ばれます。特に「forEach」メソッド内の「ラムダ式」に慣れていない人が多いプロジェクトなどでは、敢えて「拡張for文」で記載するのも1つの方法です。逆にプロジェクトメンバー全てがJavaに精通していることや、自分以外誰もメンテナンスしないプログラムであれば、「forEach」メソッドはステップ数を減らし可読性を高める効率的な方法です。周囲の状況やコーディング規約などを意識しながら、うまく「for」文の使い分けしてみてください。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)