Java : if文の基本 (文法)
プログラムをある条件で分岐させたい…そんなときに使うのが if文です。
Javaに限らず、プログラミング言語にはなくてはならない基本的な文法ですね。
本記事では、そんな if文の基本的な使い方をご紹介します。
if文
if文は、プログラムを条件分岐させるための制御文です。
if (条件式) {
... then文 ...
}
これが基本形となります。
条件式が true となる場合、then文 が実行されます。
条件式が false となる場合、then文 は実行されません。
次のコードは、条件式が true になる例です。
※System.out.println は、値をコンソールに出力するためのメソッドです。
final var num = 5;
if (num > 0) {
System.out.println("OK!");
}
// 結果
// ↓
//OK!
条件式は
num > 0
の部分です。
num 変数は 5 なので、5 > 0、つまり true というわけですね。
条件式が true なので、then文である
System.out.println("OK!");
が実行されます。
結果としてコンソールに "OK!" の文字が表示されました。
then文 には、複数の文を書くこともできます。
final var num = 5;
if (num > 0) {
System.out.println("OK! : 1");
System.out.println("OK! : 2");
System.out.println("OK! : 3");
}
// 結果
// ↓
//OK! : 1
//OK! : 2
//OK! : 3
それでは、もう少し詳しく見ていきましょう。
条件式
if (条件式) {
... then文 ...
}
条件式は、結果が boolean(真偽値) となる 式 のみ許容します。
boolean にならないものはコンパイルエラーとなります。
例えば < や > による大小の比較や、== による比較は、結果が boolean となる式です。
// 式 : 5 > 3
final var exp1 = 5 > 3;
System.out.println(exp1); // true
// 式 : 4 < -1
final var exp2 = 4 < -1;
System.out.println(exp2); // false
// 式 : 10 == 10
final var exp3 = 10 == 10;
System.out.println(exp3); // true
// コンパイルOK
final var num = 5;
if (num > 3) {
}
if (num < -1) {
}
if (num == 10) {
}
もしくは、結果が boolean となるメソッドの呼び出しも OK です。
例えば、文字列の比較に使う equals メソッドは boolean を返します。
final var exp1 = "abc".equals("abc");
System.out.println(exp1); // true
final var exp2 = "abc".equals("xyz");
System.out.println(exp2); // false
// コンパイルOK
final var str = "abc";
if (str.equals("xyz")) {
}
複数の条件式を使いたい場合は && や || といった論理演算も使えます。
final var exp1 = 5 > 3;
System.out.println(exp1); // true
final var exp2 = "abc".equals("xyz");
System.out.println(exp2); // false
final var exp3 = exp1 && exp2;
System.out.println(exp3); // false
final var exp4 = exp1 || exp2;
System.out.println(exp4); // true
// コンパイルOK
final var num = 5;
final var str = "abc";
if (num > 3 && str.equals("xyz")) {
}
if (num > 3 || str.equals("xyz")) {
}
足し算、引き算など + や - を使った式は、結果が数値となります。
boolean ではないので if文の条件式には使えません。
// 式 : 5 + 3
final var exp1 = 5 + 3;
System.out.println(exp1); // 8
// 式 : 4 - 1
final var exp2 = 4 - 1;
System.out.println(exp2); // 3
// コンパイルエラー
final var num = 5;
if (num + 3) {
}
if (num - 1) {
}
補足
- Java以外のプログラミング言語には、条件式に boolean 以外を許容しているものもあります。
例えば C言語では、条件式に数値も許容しています。 0 は false、それ以外は true として扱います。 - しかし、Java では厳密に boolean のみを許容します。0 や 1 といった数値を条件式に使うとコンパイルエラーになります。
条件分岐
if (条件式) {
... then文 ...
}
条件式が true の場合、then文 が実行されます。
条件式が false の場合、then文 は実行されません。
これにより、プログラムを条件によって分岐させることができます。
コード例を見てみましょう。
条件式が true になる例 | 条件式が false になる例 |
---|---|
|
|
|
|
なんとなく if文のイメージがつかめましたでしょうか。
{ } の省略
if (条件式)
then文
then文が 1つの文 のみの場合は { } を省略することができます。
final var num = 5;
// 通常の書きかた
if (num > 0) {
System.out.println("OK! : 1");
}
// こう書いたり…
if (num > 0)
System.out.println("OK! : 2");
// こう書くこともできます。
if (num > 0) System.out.println("OK! : 3");
// 結果
// ↓
//OK! : 1
//OK! : 2
//OK! : 3
ただし、{ } を省略すると、思わぬコーディングミスを誘発してしまうかもしれません。
次のコード例を見てみましょう。
var num = -5;
if (num > 0) num++; num *= 10;
System.out.println("num : " + num);
さて、ぱっと見て、どのような結果になるかわかりますでしょうか。
num 変数はマイナスなので、if文の条件式は false になります。
よって、then文は実行されないから num = -5 がそのまま出力されるのかと思いきや…結果は次のようになります。
num : -50
なぜこのような結果になるのか考えてみます。
if文の { } を省略したので、then文は
num++;
の 1つの文 だけが対象となります。
その後ろの
num *= 10;
の文は、if文の外側となります。
つまり次のコードと同じ意味になります。
if (num > 0) {
num++;
}
num *= 10;
{ } がないと、どこまでが then文なのか分かりにくくなることがあります。
個人的には、1つの文のみの場合でも { } は省略しないほうがよいんじゃないかな…と思います。
if-else文
if-else文は、if文に else が追加された形です。
それ以外は if文と同じです。
if (条件式) {
... then文 ...
} else {
... else文 ...
}
条件式が true の場合は then文 が実行されます。
条件式が false の場合は else文 が実行されます。
if文が分かっていれば、if-else文も分かりやすいかな、と思います。
final var num = 5;
if (num > 0) {
System.out.println("then!");
} else {
System.out.println("else!");
}
// 結果
// ↓
//then!
if (num < 0) {
System.out.println("then!");
} else {
System.out.println("else!");
}
// 結果
// ↓
//else!
if-elseif文
if-elseif は、if文に else if が追加された形です。
else if はいくつでも繋げることができます。また、後述しますが else を追加することもできます。
if (条件式1) {
... then文1 ...
} else if (条件式2) {
... then文2 ...
}
条件式1 が true の場合、then文1 が実行されます。
条件式1 が false で、条件式2 が true の場合、then文2 が実行されます。
コード例で見ていきましょう。
final var num = 7;
if (num < 5) {
System.out.println("num < 5");
} else if (num < 10) {
System.out.println("num < 10");
} else if (num < 20) {
System.out.println("num < 20");
}
// 結果
// ↓
//num < 10
if-elseif文の条件式は、上から順番にチェックされていきます。
そして、条件式が true になったら then文を実行して if文は終わります。それ以降の条件式はチェックされません。
上記のコード例では、次のような処理になります。
処理 | コード | |
---|---|---|
1 | はじめに num < 5 の条件式がチェックされます。 num 変数は 7 なので、条件式は 7 < 5 です。 結果は false なので次へ。 |
|
2 | 次の条件式である num < 10 がチェックされます。 条件式は 7 < 10 …結果は true なので then文を実行して if-elseif文は終了します。 |
|
3 | 最後の条件式 num < 20 は true になりますがチェックされません。 then文も実行されません。 |
|
if-elseif文 には else を追加することもできます。
if (条件式1) {
... then文1 ...
} else if (条件式2) {
... then文2 ...
} else {
... else文 ...
}
すべての条件式が false の場合、else文 が実行されます。
final var num = 100;
if (num < 5) {
System.out.println("num < 5");
} else if (num < 10) {
System.out.println("num < 10");
} else {
System.out.println("else!");
}
// 結果
// ↓
//else!
補足
switch式
プログラムを条件分岐をさせたい場合、if文の代わりに switch式 を使うこともできます。
列挙型(enum) のような網羅性のある分岐をしたい場合には switch式 のほうが便利かもしれません。
enum Fruit {
BANANA,
APPLE,
ORANGE,
}
final var fruit = Fruit.APPLE;
switch (fruit) {
case BANANA -> System.out.println("Banana!");
case APPLE -> System.out.println("Apple!");
case ORANGE -> System.out.println("Orange!");
}
// 結果
// ↓
//Apple!
関連 :
公式ドキュメント
さらに詳しく if文について知りたい場合は、公式のJava言語仕様に記載があります。
(残念ながら公式の日本語訳はないようです)
まとめ
if文を使うと、プログラムを条件分岐させることができます。
なくてはならない基本的な文法なので、よく理解して使いたいですね。
関連記事
- while文の基本
- for文の基本
- プリミティブ型 (基本データ型)
- リテラルの表記方法いろいろ
- クラスの必要最低限を学ぶ
- インタフェースの default メソッドとは
- インタフェースの static メソッドの使いどころ
- var (型推論) のガイドライン
- アクセス修飾子の基本
- 配列 (Array) の使い方
- 拡張for文 (for-eachループ文)
- switch文ではなくswitch式を使おう
- try-with-resources文でリソースを自動的に解放
- テキストブロックの基本
- 列挙型 (enum) の基本
- ラムダ式の基本
- レコードクラスの基本 (Record Class)
- メソッド参照の基本
- シールクラスの基本(Sealed Class)
- 無名変数の使い方