Javaプログラミング入門
8. 条件分岐
最終更新:
javatutorial
-
view
条件分岐とは
プログラムは、常に同じ動作をするだけでなく、その時々の状況に応じて適切な処理を行うことが求められます。
例えば、テストの点数によって「合格」か「不合格」かを判定したり、ログイン時に入力されたIDとパスワードが正しいかを確認したりする場面があります。
このように、ある条件を満たしているかどうかによって実行する処理を変える仕組みを条件分岐といいます。
例えば、テストの点数によって「合格」か「不合格」かを判定したり、ログイン時に入力されたIDとパスワードが正しいかを確認したりする場面があります。
このように、ある条件を満たしているかどうかによって実行する処理を変える仕組みを条件分岐といいます。
Javaでは、if文や switch文を使って条件分岐を実装できます。
条件式
例えば、私たちの日常生活でも条件によって行動を決めることがたくさんあります。

「もし雨が降っていたら、傘を持っていく」

「もし雨が降っていたら、傘を持っていく」

「もしテストの点数が80点以上なら、合格!」

「もし財布に1000円以上あったら、ランチを食べる」
プログラムでも、これと同じように条件が満たされたら〇〇するという仕組みを作ることができます。
このとき、条件が満たされたかどうかを判定するのが条件式です。
このとき、条件が満たされたかどうかを判定するのが条件式です。
条件式の結果
条件式の判定結果はtrue(真)またはfalse(偽)のどちらかになります。
true(真)→ 条件が成立した(満たしている)場合
false(偽)→ 条件が成立しなかった(満たしていない)場合
true(真)→ 条件が成立した(満たしている)場合
false(偽)→ 条件が成立しなかった(満たしていない)場合
条件式によって判定された結果はboolean型の変数に代入することもできます。
比較演算子
ある条件が成り立つかどうかを判定し、それによって動作を変える仕組みをプログラムで実現するには、比較演算子を使った条件式が必要になります。
比較演算子は、左右の2つの値を比較して真(true)または偽(false)を判定するための演算子です。
例えば、以下のような比較をすることができます。
比較演算子は、左右の2つの値を比較して真(true)または偽(false)を判定するための演算子です。
例えば、以下のような比較をすることができます。
演算子 | 意味 | 記述例 |
---|---|---|
== | aとbは等しい | a == b |
!= | aとbは等しくない | a != b |
> | aはbより大きい | a > b |
< | aはbより小さい | a < b |
>= | aはb以上 | a >= b |
<= | aはb以下 | a <= b |
サンプル:RelationalOperator.java
- public class RelationalOperator {
- int a = 10;
- int b = 10;
- boolean result = false;
- // aとbは等しいか確認
- result = a == b;
- // aとbは等しくないか確認
- result = a != b;
- // aはbより大きいか確認
- result = a > b;
- // aはbより小さいか確認
- result = a < b;
- // aはb以上か確認
- result = a >= b;
- // aはb以下か確認
- result = a <= b;
- }
- }
-
実行結果
a == b : true
a != b : false
a > b : false
a < b : false
a >= b : true
a <= b : true
論理演算子
プログラムでは、条件が〇〇のときに処理を実行するという場面がよくあります。
ただし、2つ以上の条件を組み合わせたい ということもあります。
例えば

「80点以上かつ宿題を提出していれば合格」
ただし、2つ以上の条件を組み合わせたい ということもあります。
例えば

「80点以上かつ宿題を提出していれば合格」

「雨が降っているまたは天気予報が雨なら傘を持っていく」
このように、複数の条件を組み合わせるために使うのが論理演算子です。
主に以下の3つの演算子を使用することが多いです。
演算子 | 意味 | 記述例 |
---|---|---|
&& | aかつbの条件が満たされている | a && b |
|| | aまたはbの条件が満たされている | a || b |
! | aの条件は満たされていない | !a |
サンプル:LogicalOperator.java
- public class LogicalOperator {
- boolean a = true;
- boolean b = false;
- boolean result = false;
- // aかつbの条件が満たされている
- result = a && b;
- // aまたはbの条件が満たされている
- result = a || b;
- // aの条件は満たされていない
- result = !a;
- // bの条件は満たされていない
- result = !b;
- }
- }
-
a && b : false
a || b : true
!a : false
!b : true
if文
if文は、プログラムの実行中に特定の条件を満たした場合にのみ、決められた処理を実行するための仕組みです。
例えば、スマートフォンのロック解除を考えてみましょう。
正しいパスワードが入力された場合にのみロックが解除され、不正なパスワードなら解除されません。

正しいパスワードが入力された場合にのみロックが解除され、不正なパスワードなら解除されません。

このように、条件を判定し(例:パスワードが正しい)、その結果に応じて処理(例:ロックを解除するor解除しない)を分岐させるのがif文の役割です。
プログラムの中では、もし○○なら××をするという判断をするためにif文が使われます。
プログラムの中では、もし○○なら××をするという判断をするためにif文が使われます。
記述方法
if文の記述方法は
if (条件式) {
}
になります。
()の中に入る条件式は比較演算子や論理演算子を使用した式などになります。
()の中に入る条件式は比較演算子や論理演算子を使用した式などになります。
例:もしテストの点数が60点以上なら「合格」という文字列を出力したい場合
サンプル:IfSample.java
サンプル:IfSample.java
- public class IfSample {
- int score = 75; // テストの点数
- if (score >= 60) {
- }
- }
- }
-
出力結果
合格
score >= 60という条件式がtrueなら"合格"と表示され
score >= 60がfalseの場合は、何も表示されません。
score >= 60がfalseの場合は、何も表示されません。
スコープ
- public class ScopeExample {
- int x = 10; // これはどこでも使える
- if (x > 5) {
- int y = 20; // この y は {} の中だけで使える
- }
- }
- }
-
実行結果
エラー: シンボルを見つけられません
System.out.println("y: " + y); // エラー!y はもう使えない
^
シンボル: 変数 y
場所: クラス Main
エラー1個

解説:
変数xはmainメソッドの中で最初に宣言されているので
mainメソッドの{}の中なら、どこでも使えます。
つまり、if文の中でも、その後の System.out.println(x);でも変数xを使うことができます。
変数yはif文の{}の中で作られているのでif文の{}の中だけで使えます。
if文の外では変数yは存在しないので、エラーになってしまいます。
このように、変数の使える範囲の事をスコープと言いますので覚えておくようにしてください。
if-else文
先ほどのif文は条件が満たされている場合のみ初期を行いましたが
条件が満たされていない時、処理を行う方法があります。
それがelse文というもので、if文と組み合わせて使用します。
条件が満たされていない時、処理を行う方法があります。
それがelse文というもので、if文と組み合わせて使用します。
先ほどのif文は、条件が満たされている場合にのみ処理を実行しました。
しかし、条件が満たされていない場合にも別の処理を行いたいことがあります。
そのときに使うのがelse文です。
else文はif文と組み合わせて使い、条件が満たされていない場合の処理を指定することができます。
サンプル:IfElseSample.java
しかし、条件が満たされていない場合にも別の処理を行いたいことがあります。
そのときに使うのがelse文です。
else文はif文と組み合わせて使い、条件が満たされていない場合の処理を指定することができます。
サンプル:IfElseSample.java
- public class IfElseSample {
- int score = 75; // テストの点数
- if (score >= 60) {
- } else {
- }
- }
- }
-
こちらのプログラムは
もしscoreに代入される値が60未満だった場合、条件がfalseになるので、
代わりにelseブロック内の処理が実行されます。
もしscoreに代入される値が60未満だった場合、条件がfalseになるので、
代わりにelseブロック内の処理が実行されます。
else if文
if文とelse文は、ある条件を満たしているかどうかをチェックし、その結果によって実行する内容を決める仕組みです。
しかし、if文だけでは1つの条件しか判断できません。
もしいくつかの条件を順番にチェックして、当てはまるものを探したいという場合には、else if文を使います。
else if文とは、最初の条件に当てはまらなかった場合に、次の条件をチェックするための方法です。
こうすることで、いくつかの条件の中から一番合うものを選び、適切な処理を実行することができます。
しかし、if文だけでは1つの条件しか判断できません。
もしいくつかの条件を順番にチェックして、当てはまるものを探したいという場合には、else if文を使います。
else if文とは、最初の条件に当てはまらなかった場合に、次の条件をチェックするための方法です。
こうすることで、いくつかの条件の中から一番合うものを選び、適切な処理を実行することができます。
else if文の基本的な文法
- if (条件1) {
- // 条件1がtrueのときに実行される処理
- } else if (条件2) {
- // 条件1がfalseで、条件2がtrueのときに実行される処理
- } else if (条件3) {
- // 条件1と条件2がfalseで、条件3がtrueのときに実行される処理
- } else {
- // すべての条件がfalseのときに実行される処理
- }
-
💡ポイント
1. if は最初に条件をチェックする。
2. else if は、前の条件がfalseの場合に次の条件をチェックする。
3. else は、それまでのすべての条件がfalseだった場合に実行される(省略可能)。
4. 上から順番に判定され、最初にtrueになった部分の処理が実行される。
5. それ以降の条件はチェックされない。
サンプル:ElseIfSample.java
1. if は最初に条件をチェックする。
2. else if は、前の条件がfalseの場合に次の条件をチェックする。
3. else は、それまでのすべての条件がfalseだった場合に実行される(省略可能)。
4. 上から順番に判定され、最初にtrueになった部分の処理が実行される。
5. それ以降の条件はチェックされない。
サンプル:ElseIfSample.java
- public class ElseIfSample {
- int score = 85; // 例:テストの点数
- if (score >= 90) {
- } else if (score >= 80) {
- } else if (score >= 70) {
- } else if (score >= 60) {
- } else {
- }
- }
- }
-
実行結果
成績はBです
このプログラムの動き
score が 90 以上 → 「成績はAです」を表示
score が 80 以上 90 未満 → 「成績はBです」を表示
(この例では 85 なので、ここで処理が決定)
score が 70 以上 80 未満 → 「成績はCです」を表示
score が 60 以上 70 未満 → 「成績はDです」を表示
score が 60 未満 → 「成績はF(不合格)です」を表示
score が 90 以上 → 「成績はAです」を表示
score が 80 以上 90 未満 → 「成績はBです」を表示
(この例では 85 なので、ここで処理が決定)
score が 70 以上 80 未満 → 「成績はCです」を表示
score が 60 以上 70 未満 → 「成績はDです」を表示
score が 60 未満 → 「成績はF(不合格)です」を表示
else if文を使用する際は、条件式を判定する順番に気を付ける必要があります。
先ほどの条件を成績Aと成績Cの条件を逆にしてみましょう。
先ほどの条件を成績Aと成績Cの条件を逆にしてみましょう。
- public class Main {
- int score = 85; // 例:テストの点数
- if (score >= 70) {
- } else if (score >= 80) {
- } else if (score >= 90) {
- } else if (score >= 60) {
- } else {
- }
- }
- }
-
実行結果
成績はCです
変数scoreに代入している値は85なのにもかかわらず、成績がAになりませんでした。
先ほどのポイントにもありましたが、if文に記載している条件式は上から順番に判定され、最初にtrueになった部分の処理が実行されます。

そのため、このように条件式の順番を間違えてしまうと、思わぬバグを生んでしまう可能性がありますので注意が必要です。
先ほどのポイントにもありましたが、if文に記載している条件式は上から順番に判定され、最初にtrueになった部分の処理が実行されます。

そのため、このように条件式の順番を間違えてしまうと、思わぬバグを生んでしまう可能性がありますので注意が必要です。
文字列の比較
Javaで文字列を比べるときは==で、正しく比較することができません。
サンプル:StringComparison.java
サンプル:StringComparison.java
- public class Main {
- str2 += "e";
- str2 += "l";
- str2 += "l";
- str2 += "o";
- }
- }
-
実行結果
str1 : Hello
str2 : Hello
str1 == str2 : false
==ではなく(文字列を代入した)変数名.equals()という命令を使うのが正解です。
.equals()の()の中に比較したい文字列を指定します。
サンプル:EqualsSample.java
.equals()の()の中に比較したい文字列を指定します。
サンプル:EqualsSample.java
public class EqualsSample {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "H";
str2 += "e";
str2 += "l";
str2 += "l";
str2 += "o";
System.out.println("str1 : " + str1);
System.out.println("str2 : " + str2);
System.out.println("str1.equals(str2) : " + str1.equals(str2));
}
}
実行結果
str1 : Hello
str2 : Hello
str1.equals(str2) : true
現時点では、文字列の比較は==ではなく(文字列を代入した)変数名.equals()という命令を使うという事だけを理解していただければ問題ありません。
それでも、何故このような現象が起きるのかが気になる方は、下のコラムを参照してください。
それでも、何故このような現象が起きるのかが気になる方は、下のコラムを参照してください。
switch文

みなさん、自動販売機で飲み物を買ったことあると思います。
自動販売機は、お金を入れてボタンを押すと、選んだ飲み物が出てくる仕組みです。
例えば、コーラのボタンを押したらコーラが出る、お茶のボタンを押したらお茶が出るのように、それぞれのボタンに決まった飲み物が対応しています。
プログラミングでも、こういう選んだものに応じて処理を変えることができます。
それがswitch文になります。
たとえば、番号を入力して「1番ならコーラ」「2番ならお茶」「3番なら水」と表示するようなプログラムを作ることができます。
もちろんif文を使用しても、同じ処理を書くことができますが、何回もif文を書かないといけなくて大変です。
サンプル:DrinkSelectUseIf.java
それがswitch文になります。
たとえば、番号を入力して「1番ならコーラ」「2番ならお茶」「3番なら水」と表示するようなプログラムを作ることができます。
もちろんif文を使用しても、同じ処理を書くことができますが、何回もif文を書かないといけなくて大変です。
サンプル:DrinkSelectUseIf.java
- public class DrinkSelectUseIf {
- // 選択した番号
- int choice = 2;
- if (choice == 1) {
- } else if (choice == 2) {
- } else if (choice == 3) {
- } else if (choice == 4) {
- } else {
- }
- }
- }
-
こうなると、選択肢が増えるたびにelse ifをどんどん書き足さなければならず、見た目も読みにくくなります。
このように、判定する値の種類(選択肢)が増えるほど、if文よりもswitch文の方がコードが読みやすくなり、管理もしやすくなります。
このように、判定する値の種類(選択肢)が増えるほど、if文よりもswitch文の方がコードが読みやすくなり、管理もしやすくなります。
記述方法
switch文の記述方法は
switch (判定する値) {
case 値1:
// 値1に一致したときの処理
break;
case 値2:
// 値2に一致したときの処理
break;
case 値3:
// 値3に一致したときの処理
break;
default:
// どの値にも一致しないときの処理
}
になります。
()の中に入る値は、今まで習ったデータ型だと、byte型、short型、int型、char型、String型のみが指定できます。
float型、double型、long型、boolean型は指定することができません。
()の中に入る値は、今まで習ったデータ型だと、byte型、short型、int型、char型、String型のみが指定できます。
float型、double型、long型、boolean型は指定することができません。
例:先ほどのif文で書いた自動販売機のプログラムをswitch文で記載した場合
サンプル:DrinkSelectUseSwitch.java
サンプル:DrinkSelectUseSwitch.java
- public class DrinkSelectUseSwitch {
- int choice = 2;
- switch (choice) {
- case 1:
- break;
- case 2:
- break;
- case 3:
- break;
- case 4:
- break;
- default:
- }
- }
- }
-
実行結果
お茶です!
例:判定する値を文字列にした場合
サンプル:DrinkSelectUseSwitchString.java
サンプル:DrinkSelectUseSwitchString.java
- public class DrinkSelectUseSwitchString {
- switch (drink) {
- case "コーラ":
- break;
- case "お茶":
- break;
- case "水":
- break;
- default:
- }
- }
- }
-
実行結果
コーラが出ます!
case文
switch文は、何かの値によってやることを決めるときに使います。
その中でもcaseはもしこの値だったら、この処理をするよ!と決める部分になります。
その中でもcaseはもしこの値だったら、この処理をするよ!と決める部分になります。
break;は何のためにあるの?
試しにbreakを全て抜いたやつを実行してみましょう。
サンプル:DrinkSelectNoUseBreak.java
サンプル:DrinkSelectNoUseBreak.java
- public class DrinkSelectNoUseBreak {
- switch (drink) {
- case "コーラ":
- case "お茶":
- case "水":
- default:
- }
- }
- }
-
実行結果
- コーラが出ます!
- お茶が出ます!
- 水が出ます!
- その飲み物はありません。
このままだと、すべての飲み物が表示されてしまいます。
そのため、それぞれのcaseで処理を止めたい場合は、breakを忘れずに書きましょう。
そのため、それぞれのcaseで処理を止めたい場合は、breakを忘れずに書きましょう。
💡注意
switch文の比較はあくまで ==です。
大小の比較は行うことができませんので注意が必要です。
switch文の比較はあくまで ==です。
大小の比較は行うことができませんので注意が必要です。
コラム
もう一つの論理演算子
3つの論理演算子を紹介しましたが、実はあと1つだけあります。
あまり一般的に使いませんが、知っておいて損はありません。
あまり一般的に使いませんが、知っておいて損はありません。
演算子 | 説明 | 記述例 |
---|---|---|
^ | aまたはbの条件が満たされている | a ^ b |
スコープは自作できます
{}(ブロック)は、単体で使うことができます。
必ずしもif文やswitch文などの構文と一緒に書く必要はありません。
そのため、以下のように ブロックのスコープを利用すると、同じ変数名を別々のブロックで定義することが可能です。
(ただし、この書き方は非常に危険ですので全く推奨されません)
必ずしもif文やswitch文などの構文と一緒に書く必要はありません。
そのため、以下のように ブロックのスコープを利用すると、同じ変数名を別々のブロックで定義することが可能です。
(ただし、この書き方は非常に危険ですので全く推奨されません)
- public class Main {
- {
- int a = 10;
- }
- {
- int a = 20;
- }
- }
- }
-
なんで文字列は==で比較をしてはいけないの?
==演算子は、数値同士を比較するための演算子です。
また、char型やboolean型も内部的には数値として扱われます。
文字列同士を==で比較すると、文字列の中身ではなく、メモリ上の参照先を比べることになります。
文字列が作られると、コンピュータのメモリのどこかにその文字列が保存されます。
そして、変数には文字列の中身ではなく、その保存場所(メモリのアドレスのような値)が入る仕組みになっています。

そのため、== で比較すると、文字列そのものが同じか?ではなく、同じ場所を指しているか?を比べている ことになります。

equals()を使用すると、文字列全体を比較する処理が動き、文字列そのものが同じかを判定してくれます。
また、char型やboolean型も内部的には数値として扱われます。
文字列同士を==で比較すると、文字列の中身ではなく、メモリ上の参照先を比べることになります。
文字列が作られると、コンピュータのメモリのどこかにその文字列が保存されます。
そして、変数には文字列の中身ではなく、その保存場所(メモリのアドレスのような値)が入る仕組みになっています。

そのため、== で比較すると、文字列そのものが同じか?ではなく、同じ場所を指しているか?を比べている ことになります。

equals()を使用すると、文字列全体を比較する処理が動き、文字列そのものが同じかを判定してくれます。
switch文のdefaultって省略できないの?
- switch文のdefaultが省略できる場合
すべてのケースを網羅できる場合、defaultを書かなくても問題ありません。
ただし、これができるのは、大体switch文の条件に列挙型の変数を使っている場合のみです。
それ以外のデータ型では、基本的にすべてのケースを網羅するのは難しいため、defaultを書くのが一般的です。
例えば、byte型は理論的にはすべてのケースを網羅でそうですが、int型やString型などは現実的に網羅しきれません。
そのため、defaultを省略したい場合は、網羅性を考慮して列挙型を使うのがおすすめです。
ただし、これができるのは、大体switch文の条件に列挙型の変数を使っている場合のみです。
それ以外のデータ型では、基本的にすべてのケースを網羅するのは難しいため、defaultを書くのが一般的です。
例えば、byte型は理論的にはすべてのケースを網羅でそうですが、int型やString型などは現実的に網羅しきれません。
そのため、defaultを省略したい場合は、網羅性を考慮して列挙型を使うのがおすすめです。
- switch文のdefaultが省略できない場合
すべてのケースを網羅できない場合は、適切な処理を行うためにdefaultを書く必要があります。
例えば、列挙型をswitch文で使うとき、すべての列挙型定数をcaseに書ききれない場合があります。
このように、予想外の値が渡ってくる可能性がある場合は、適切な処理を行うためにdefaultを用意しておくべきです。
また、エラー処理のためにもdefaultが必要です。
どの case にも当てはまらないときに、例外を発生させる、エラーメッセージをログに記録する
といった処理を行いたい場合、defaultを使うのが一般的です。
例えば、列挙型をswitch文で使うとき、すべての列挙型定数をcaseに書ききれない場合があります。
このように、予想外の値が渡ってくる可能性がある場合は、適切な処理を行うためにdefaultを用意しておくべきです。
また、エラー処理のためにもdefaultが必要です。
どの case にも当てはまらないときに、例外を発生させる、エラーメッセージをログに記録する
といった処理を行いたい場合、defaultを使うのが一般的です。