この記事では、弊社の新人エンジニア研修の参考にJava8を解説します。
前回は演算子について解説しました。
今回は条件分岐と判定条件について解説します。
あわせて、前回の演算子の続きで、
・関係演算子(比較演算子とも呼ばれます)
・三項演算子
・論理演算子
1.if文
if文を使い条件に応じて処理をさせたり、させなかったりといったプログラムが作成できます。
例えば、「もしも、20歳以上なら酒を飲む」といった処理です。
if(20歳以上){
酒を飲む;
}
一般化すると以下のように書けるでしょう。
<構文>
if(条件式){
命令文;
}
上記の命令文は条件がtrueの場合に実行されます。
条件式はboolean型の値、つまり true または false という値を持つものであればなんでもOKです。
Javaで書くと以下のようになります。
1 2 3 4 5 6 7 8 9 10 |
package chap04; public class Example01 { public static void main(String[] args) { int age = 20; if (age >= 20) System.out.println("酒を飲む"); } } |
このプログラムを実行すると条件式の値はtrueのため標準出力には「酒を飲む」と出力されます。
条件式の値がfalseの場合(例えば、age = 19)は何も出力されません。

条件がtrueの場合のみ処理をするif文
この時の、「>=」記号を関係演算子と呼びます。
関係演算子とは、2つの式や値の比較を行い、結果を真偽値で返すもののことをいいます。
関係演算子の解釈で新入社員の皆さんにアドバイスできることとしては、あまり長々と考え込まないことです。
true or false の判断さえできれば大丈夫です。
例えば、
age >= 20
というのも長々と見ているとだんだん意味がぼやけてしまうからです。(ゲシュタルト崩壊)
実際に変数に値を入れて、
20 >= 20
2.関係演算子
ここで、Javaの判定条件を構成する関係演算子をまとめましょう。
以下のサンプルコードを見てください。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package chap04; public class Example01_1 { public static void main(String[] args) { System.out.println(1 == 1); System.out.println(1 != 2); System.out.println(1 > 2); System.out.println(1 < 2); System.out.println(1 >= 2); System.out.println(1 <= 2); } } |
<結果は下記の表の右端列>
関係演算子 | 読み方 | 説明 | 式の例 | 結果(値) |
== | イコールイコール | 左辺と右辺が等しい | 1 == 1 | true |
!= | びっくりイコール | 左辺と右辺が等しくない | 1 != 2 | true |
> | 大なり | 左辺が右辺より大きい | 1 > 2 | false |
< | 小なり | 左辺が右辺より小さい | 1 < 2 | true |
>= | 大なりイコール | 左辺が右辺以上である | 1 >= 2 | false |
<= | 小なりイコール | 左辺が右辺以下である | 1 <= 2 | true |
instanceof ※後述 | インスタンスオブ | 左辺が右辺のクラスまたはそのサブクラスのインスタンスである | Integer i = 1; i instanceof Number; |
true |
前回解説したように=が一つは代入の意味でした。
そのためJavaで等しいを表現するには「==」と=を2つ重ねます。
ここはベテランでも間違いやすいところです。
また、「より大きい(超過)」と「以上」、「より小さい(未満)」と「以下」も厳密に使い分ける必要があります。
練習問題をやってみましょう。
問題 | 解答 | 変数aの値が19である時 |
1.変数aの値が20である | a == 20 | false |
2.変数aの値が20でない | ||
3.変数aの値が20より大きい | ||
4.変数aの値が20より小さい | ||
5.変数aの値が20以上である | ||
6.変数aの値が20以下である |
なお、 命令文が1つだけの場合は{}を省略することも可能です。
以下のプログラムは上記プログラムと同じ結果になります。
1 2 3 4 5 6 7 8 9 10 11 |
package chap04; public class Example02 { public static void main(String[] args) { int age = 20; if (age >= 20) { System.out.println("酒を飲む"); } } } |
<結果>
酒を飲む |
ただし、うっかりすると以下のように条件に応じた処理の範囲を間違えることもあります。
未成年に対しては酒も煙草も禁じるつもりで以下のように書くと意図しない結果になります。
1 2 3 4 5 6 7 8 9 10 11 |
package chap04; public class Example03 { public static void main(String[] args) { int age = 19; if (age >= 20) System.out.println("酒を飲む"); System.out.println("煙草も吸う"); } } |
<結果>
煙草も吸う |
したがって、一文の処理であっても{}で囲むことは良い習慣です。
※IDEのフォーマットをかけてもそうなるのではないでしょうか?
ただし、他人の書いたコードは{}で囲まれていないことも想定してください。
3.if else文
例えば、「もしも、20歳以上なら酒を飲む、そうでなければジュースを飲む」といった表示をさせたい場合はどうすればいいでしょうか?

条件がfalseの場合にも処理をするif文
多分岐構造にはif else文が使えます。
if(20歳以上){
酒を飲む;
} else {
ジュースを飲む;
}
Javaで書くと以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package chap04; public class Example04 { public static void main(String[] args) { int age = 19; if (age >= 20) { System.out.println("酒を飲む"); } else { System.out.println("ジュースを飲む"); } } } |
<結果>
ジュースを飲む |
ちなみに if~else文はIDEのコードテンプレートという機能を使うと簡単にひな形が挿入できますので講師から聞いてください。
このプログラムを実行すると条件式の値はfalseのため標準出力には「ジュースを飲む」と出力されます。
では、さらに細かく条件ごとの処理に分岐させたい場合はどうしたらよいでしょうか?
以下のように if~else文を連結することができます。
なお、“ifelse”ではなく、“if else”のようにifとelseの間にはスペースが入ります。
点数(score)によってS,A,B,Cの4段階評価を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package chap04; public class Example05 { public static void main(String[] args) { int score = 88; if (score > 90) { System.out.println("S"); } else if (score > 80) { System.out.println("A"); } else if (score > 70) { System.out.println("B"); } else { System.out.println("C"); } } } |
<結果>
A |
ただし、条件が多くなると記述が複雑になってしまうのがif else文の欠点です。
4.switch文
switch文はアルゴリズムでいう多岐分岐を扱う文です。
文法は以下の通りです。
<構文>
switch (式) { case 値A: // 式の値が値Aだったときの処理 break; case 値B: // 式の値が値Bだったときの処理 break; default: // 式の値がいずれのcaseの値とも一致しなかったときの処理 } |
switch文の値で使える型は、char、byte、short、int、String、enum(後述)があります。
default句は値がどのcaseの値とも一致しなかった場合の処理を記述するためにあります。
このswitch文もIDEのコードテンプレートによって簡単にひな形が挿入できますので講師から聞いてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package chap04; public class Example06 { public static void main(String[] args) { int data = 70; switch (data) { case 60: System.out.println("C"); break; case 70: System.out.println("B"); break; case 80: System.out.println("A"); break; default: System.out.println("D"); } } } |
<結果>
B |
ただし、スイッチの状態にはオンとオフしかなく、中間はありません。
同様にswitch文は何かの間を表現することはできません。
例えば、「60以上70未満」の場合、といった表現は不可能です。
そのような場合はif文を使います。
なお、break句が使用されない場合、一致するケースの後のすべてのswitch文が終わりまで順番に実行され意図しない結果になることがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package chap04; public class Example07 { public static void main(String[] args) { int data = 70; switch (data) { case 60: System.out.println("C"); case 70: System.out.println("B"); case 80: System.out.println("A"); default: System.out.println("D"); } } } |
<結果>
B A D |
フォールスルー(fall through)といいバグの温床になり得ます。
5.三項演算子
ここでは、少し応用的なテーマとして三項演算子を紹介します。
三項演算子を使うと一文で簡潔に分岐構造を表現できます。
三項演算子の基本構文は以下の通りです。
<構文>
条件式 ? 値1 : 値2 |
条件式がtrueの場合に、式全体の値が値1に、falseの場合には値2になります。
値の位置に処理が書けるわけではありませんので気をつけましょう。
具体例で見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
package chap04; public class Example08 { public static void main(String[] args) { char c = 'y'; String result; result = (c == 'y') ? "Yes" : "No"; System.out.println(result); } } |
<結果>
Yes |

三項演算子の見方
ただし、
三項演算子を多用することには可読性を低くするという批判もあります。
極端に複雑な入れ子構造を使用したりはしないようにしましょう。
6.論理演算子
論理演算子を使うと複雑な条件式を組み合わせることができます。
論理演算子は次の4種類です。
演算子 | 読み方 | 式がtrueになる条件 | 使用例 |
&& | かつ AND | 左辺と右辺の両方がtrue | gender == ‘F’ && age >= 16 |
|| | または OR | すくなくとも左辺と右辺のどちらかがtrue | gender == ‘F’ || age >= 16 |
! | 否定 NOT | 条件式がfalse | !(gender == ‘F’ ) |
^ | XOR(エクスオアー) | 左辺と右辺のどちらかがtrueで他方がfalse | gender == ‘F’ ^ age >= 16 |
xorは結構ですので、まずは、AND、OR、NOTを押さえましょう。
以下のサンプルコードで確認してください。
1 2 3 4 5 6 7 8 9 10 11 12 |
package chap04; public class Example10 { public static void main(String[] args) { System.out.println(true && true); System.out.println(true && false); System.out.println(true || false); System.out.println(!true); System.out.println(!false); } } |
<結果>
true false true false true |
例えば、学生の成績を付けるプログラムを考えます。
英語(English)と数学(Math)それぞれ100点満点のテストで評価はS,A,B,Cの4段階評価とします。
英語と数学の両方が80点以上だったらS評価。
どちらか一方が80点以上だったらA評価。
どちらか一方が70点以上だったらB評価。
それ以外はC評価とします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Example09 { public static void main(String[] args) { int english = 80; int math = 75; if (english >= 80 && math >= 80) { System.out.println("S"); } else if (english >= 80 || math >= 80) { System.out.println("A"); } else if (english >= 70 || math >= 70) { System.out.println("B"); } else { System.out.println("C"); } } } |
<結果>
A |
論理演算子なしで同じコードを書こうとしたら大変です。
演算子がいくつか出てきたところでその優先順位についてまとめます。
算術演算子 > 関係演算子 > 論理演算子
の順に優先されます。
まず、算術演算子は関係演算子より優先されます。
例えば、
a + 1 > b -10
という式は以下のように解釈されます。
(a + 1) > (b -10)
※()内が優先される
また、関係演算子は論理演算子より優先されます。
gender == ‘F’ && age >= 16
という式は以下のように解釈されます。
(gender == ‘F’) && (age >= 16)
また、論理積は論理和よりも優先されますが、カッコを使うことで論理和を優先させることができるということは、数学の類推で理解可能だと思います。
a > 10 && b < 5 || c == 0
a > 10 && (b < 5 || c == 0)
さらに論理を否定した場合についても整理しておきます。
例えば、
a + 1 > b -10
という式の否定を単純に書けば、以下のようになります。
!(a + 1 > b -10)
また、カッコを開いて以下のように書くこともできます。
a + 1 <= b -10
すなわち、否定は、不等号の向きを逆にして、イコールがなければ付ける、イコールがあれば取り去る、で大丈夫です。
また、論理演算子の否定の場合は「&&は||」に、「||は&&」に変換します。
つまり、
!(gender == ‘F’ && age >= 16)
という式は以下のように解釈されます。
gender != ‘F’ || age < 16
いずれにせよ、わかり易い表現を採用しましょう。
簡単な練習問題をやってみましょう。
問題 | 解答 | a = 19 , b = 1のとき |
1.変数aの値が20である かつ 変数bの値が1である。 | a == 20 && b ==1 | false |
2.変数aの値が20である または 変数bの値が1である。 | ||
3.上記1の否定(括弧なし) | ||
4.上記2の否定(括弧なし) |
気をつけないといけないのは、日本語で「aまたはbでない」といった時に2つの意味がありえることです。
!(a or b)
か、それとも
a or !b
かです。
“ない”がどこに掛かっているのかを明確にする必要があるのです。
<まとめ:隣の人に正しく説明できたらチェックを付けましょう>
□if文を使い条件に応じて処理をさせたり、させなかったりといった処理ができる
□関係演算子とは、2つの式や値の比較を行い、結果を真偽値(true or false)で返すもののことをいう
□多分岐構造にはif else文やswitch文が使える
□三項演算子を使うと一文で簡潔に分岐構造を表現できる
□論理演算子を使うと複雑な条件式を組み合わせることができる
|
まとめができたら、アウトプットとして演習問題にチャレンジしましょう。
今回はJavaの条件分岐と判定条件について見てきました。
次回は、繰り返し処理を学んでコンピューターのパワーを実感しましょう。
JavaSE8の解説に戻る