こんにちは。今回の記事はJavaのif文についてです。これは分岐処理を記述する構文です。
値の代入などの基本的な命令文を上から順に記述した場合、上から順番に命令文が処理されます。ある条件を満たすときだけ実行したい処理がある場合、if文という構文を使うことで実装できます。
この記事では前半ではif文を1回使った例を紹介します。後半では応用として、while文と組み合わせたサンプルを紹介します。前半の内容はif文の入門にちょうど良いくらいの内容です。後半はそれよりも難易度が上の内容です。
条件分岐が必要な例
例えば、ある施設の入場料が以下のように設定されていたとします。
年齢 | 料金 |
---|---|
18以上 | 1000円 |
18未満 | 500円 |
年齢に応じて上記の表の通りに金額を返却するようなメソッドを作るとします。今回は、MyPriceクラスを作成し、以下のようなof()というメソッドを実装するとします。
修飾子とタイプ | メソッド | 説明 |
---|---|---|
static int | of(int age) | 入場料を返却する。 |
- パラメータ:
age
– 対象の年齢- 戻り値:
- 入場料
上記メソッドを呼び出すと、引数に応じて金額を返却してくれるという想定です。今回は単純化のためにstaticメソッドにしました。(クラスのインスタンスを生成する必要がない使い方ができるため。)
フロー図
今回は以下のような考え方で処理を実装します。
-
ローカル変数を宣言する。
型 変数名 初期値 int price 1000 -
以下の分岐処理をする。
条件 処理内容 age < 18
price
に500を格納する。 -
price
を返却する。
考え方としては、最初にローカル変数priceに初期値1000を格納します。この時点では、年齢が18以上の料金がpriceに格納されています。このまま、この変数をreturnするとメソッドの結果は1000です。今回の場合の考え方は、return文の前に以下の図のように分岐処理を追加するという考え方です。


この図のような分岐処理はif文という構文で記述することが可能です。if文は基本的に以下のような書き方をします。
if文の書き方
if ([条件式] {
[処理内容]
}
[条件式]がtrueの場合、[処理内容]に記述された命令が実行されます。今回の場合、条件式は「age < 18
」です。[処理内容]には「price
に500を格納する」という命令文を記述します。
上記処理の実装例が以下です。
MyPriceクラスの実装例
/**
* 入場料を扱うクラス
*/
public class MyPrice {
/** 基準となる年齢 */
public static final int base_age = 18;
/**
* 入場料を返却する。
* @param age 対象の年齢
* @return 入場料
*/
public static int of(int age) {
// (1)
int price = 1000;
// (2)
if (age < base_age) {
price = 500;
}
// (3)
return price;
}
}
上記のテスト
public class TestMyPrice {
public static void main(String[] args) {
System.out.println(MyPrice.of(18));
System.out.println(MyPrice.of(17));
}
}
結果
1000
500
(1)では変数の宣言と初期化をしています。初期値を1000にしているので、年齢18以上の場合の値です。
(2)ではif文を使って、処理を分岐させています。変数ageの値が18未満の場合、if文のブロック(波括弧で囲まれた箇所)が実行されます。そのため、変数age
の値が18未満の場合、変数price
に500が格納されます。
(3)では、price
をリターンしています。この値がメソッドが返却する値です。
上記のように、if文を使うことで、指定した条件を満たす場合の処理を記述することが可能です。
応用例:if文を他の構文と組み合わせる
応用として、while文の繰り返し処理の中でif文を使う例を紹介します。
以下のような処理を実装したいとします。
-
int型変数numを初期値0で宣言する。
-
numが5でない場合、以下の処理を繰り返す。
-
numに0から9までのランダムな値を格納する。
-
String型変数sを以下の形式で初期化する。
"回数: " + [繰り返し回数] + ", 値: " + num
-
以下の分岐処理をする。
条件 処理内容 num == 5
s
にs + " 当たり"
を格納する。 -
sをprintln()メソッドで出力する。
-
以下が実装例です。
ソース
import java.util.Random;
public class HelloWhileIf {
public static void main(String[] args) {
Random random = new Random();
int num = 0;
int cnt = 0;
// (1)
while (num != 5) {
num = random.nextInt(10); // 10未満の乱数
String s = "回数: " + ++cnt + ", 値: " + num;
// (2)
if (num == 5) {
s += " 当たり";
}
/// (3)
System.out.println(s);
}
}
}
結果(毎回変わる)
回数: 1, 値: 0
回数: 2, 値: 3
回数: 3, 値: 2
回数: 4, 値: 4
回数: 5, 値: 2
回数: 6, 値: 7
回数: 7, 値: 3
回数: 8, 値: 3
回数: 9, 値: 7
回数: 10, 値: 1
回数: 11, 値: 4
回数: 12, 値: 3
回数: 13, 値: 4
回数: 14, 値: 1
回数: 15, 値: 2
回数: 16, 値: 2
回数: 17, 値: 8
回数: 18, 値: 5 当たり
(1)ではwhile文を記述しています。(while文の開始の箇所です。)
(2)ではif文を使っています。if文の条件がtrueの場合、ブロック内の処理が実行されます。変数numには0から10未満までの数がランダムに格納されています。このため、if文の条件がtrueの場合もあるし、falseの場合もあります。このように、繰り返し処理内で特定のタイミングで実行したい処理をif文で記述できます。
(3)ではsを出力しています。
なお、Javaでは真偽値を予約語のtrue/falseで表します。if文の[条件式]の個所では、このどちらかの値を結果的に指定します。例えば、条件の箇所を0と書くと以下のコンパイルエラーが発生します。
- 型の不一致: int から boolean には変換できません
上記サンプルでは比較演算子「==」を使いました。比較演算子や論理演算子を使った文はtrue/falseのどちらかの値です。
ちなみに、boolean型変数を使って次のようなif文の記述もできます。
boolean型の実験例
boolean flag = (1 == 1);
if (flag) {
System.out.println("flagの値: " + flag);
}
結果
flagの値: true
「1 == 1」は条件式です。等号が成立するので、この条件式の結果はtrueです。なので、変数flagにはtrueが格納されます。if文の条件がtrueになり、ブロック内の処理が実行されます。このようにif文の条件にboolean型変数を使うことが可能です。
以上、参考になれば幸いです。