Javaの制御構造(条件分岐)
2025-08-01はじめに
制御構文を理解することは、Javaプログラミングにおいて非常に重要です。制御構造を使いこなすことで、プログラムに判断能力を持たせることができ、条件によって処理を分岐させることが可能になります。
また、繰り返し処理を効率的に記述できるため、同じ処理を何度も書く必要がなくなり、無駄のないコードになります。さらに、条件分岐やループ構造を適切に使うことで、コードの可読性と保守性が向上し、他の人にも理解しやすいプログラムを書くことができます。
これらの知識を身につけることで、より複雑で高度なアルゴリズムの実装も可能になり、実践的なプログラミングスキルの向上につながります。条件分岐(if/switch)について、基礎から応用まで詳細に解説します。
条件分岐:if文
基本的なif文の構文
if文は、条件に基づいて処理を分岐させる最も基本的な制御構造です。Javaのif文は、条件に応じてプログラムの実行を分岐させるための基本的な構文です。条件式が**真(true)**であれば指定された処理を実行し、**偽(false)**であればスキップされます。構文は次のようになります。
if (条件式) {
// 条件がtrueの場合に実行されるコード
}
次のコードは、avaのif文による条件分岐の基本的な例です。
int age = 20;
if (age >= 20) {
System.out.println("成人です");
}
変数ageに20という値が代入されており、if (age >= 20) の条件式が**真(true)**の場合に中括弧 {} 内の処理が実行されます。この場合、ageは20なので条件が成立し、System.out.println("成人です"); が実行され、「成人です」と出力されます。if文を使うことで、条件に応じた動作をプログラムに与えられ、判断や分岐を行うロジックを実現できます。
if-else文
条件が成立しない場合(falseの場合)の処理を追加できます。その場合(条件が満たされなかった場合)に別の処理を行いたいときは、elseを使います。
if (条件式) {
// 条件がtrueの場合
} else {
// 条件がfalseの場合
}
次のコードは、if-else文の具体例になってます。
int score = 65;
if (score >= 60) {
System.out.println("合格です");
} else {
System.out.println("不合格です");
}
変数scoreに65が代入されており、if (score >= 60)の条件式が評価されます。条件が**真(true)の場合は中括弧内の処理が実行され、「合格です」と表示されます。
もしscoreが60未満であれば、条件が偽(false)**となり、elseブロック内のSystem.out.println("不合格です");が実行されます。このようにif-else文を使うことで、状況に応じて異なる処理を分けて実行することができます。
if-else if-else文
if-else if-else文は、複数の条件を順に判定して、最初に一致した条件の処理だけを実行するための構文です。条件分岐が多い場合に使われ、プログラムに柔軟な判断を持たせることができます。構文は次のようになります。
if (条件式1) {
// 条件式1がtrueの場合
} else if (条件式2) {
// 条件式2がtrueの場合
} else {
// すべての条件がfalseの場合
}
ifは最初に評価される条件で、条件式1がtrueならその中の処理が実行され、他の条件は無視されます。もし条件式1がfalseであれば、次のelse ifが評価され、条件式2がtrueのときにそのブロックの処理が実行されます。
いずれの条件もfalseだった場合、最後のelseブロックが実行されます。このようにif-else if-else構造を使うことで、複数の条件を順に判定し、状況に応じた処理を1つだけ選んで実行できます。複雑な分岐処理を整理して記述できる点が特徴です。
次にif-else if-else文を使った具体例として成績評価を考えてみましょう。
int score = 78;
if (score >= 90) {
System.out.println("評価:A");
} else if (score >= 80) {
System.out.println("評価:B");
} else if (score >= 70) {
System.out.println("評価:C");
} else if (score >= 60) {
System.out.println("評価:D");
} else {
System.out.println("評価:F");
}
変数scoreには78が代入されています。プログラムは上から順に条件を評価し、最初に**真(true)**となったブロックだけを実行します。
まずscore >= 90は偽、次のscore >= 80も偽ですが、score >= 70が真になるため、対応する処理が実行され、「評価:C」と出力されます。その後の条件は評価されません。
このようにif-else if-else文を使うことで、複数の条件を順番にチェックし、点数や状態などに応じて適切なメッセージや動作を実現できます。
ネストしたif文
if文の中にさらにif文を入れることができます。次のコードは、**入れ子のif文(ネストされたif文)を使って、年齢と免許の有無の両方を条件として判定する例です。
int age = 25;
boolean hasLicense = true;
if (age >= 20) {
if (hasLicense) {
System.out.println("車をレンタルできます");
} else {
System.out.println("免許証が必要です");
}
} else {
System.out.println("20歳以上でないとレンタルできません");
}
変数ageが25、hasLicenseがtrueのため、まず最初のif (age >= 20)が真(true)**となり、その中の条件分岐が実行されます。次にif (hasLicense)が評価され、これもtrueなので「車をレンタルできます」と出力されます。
もし免許がなければ「免許証が必要です」と表示され、さらに年齢が20歳未満の場合は外側のelseが実行され、「20歳以上でないとレンタルできません」と表示されます。ネストしたif文を使うことで、複数の条件を組み合わせた詳細な判断が可能になります。
条件式の書き方のコツ
複合条件
複合条件を使うことで、複数の条件を1つのif文の中でまとめて判定できます。これは、論理演算子(&&, ||, !)を使って条件を組み合わせる方法です。入れ子のif文よりもコードをすっきり書けるのが特徴です。主なパターンを紹介します。
if (age >= 20 && hasLicense) {
System.out.println("レンタル可能");
}
早期リターン
**早期リターン(early return)**とは、条件を満たした時点でメソッドの処理を途中で終了し、すぐに結果を返す書き方のことです。ネスト(入れ子)の深いif文を避け、コードを読みやすくするためによく使われます。
if (age < 20) {
System.out.println("20歳未満は利用できません");
return;
}
可読性向上
条件分岐を多用するプログラムでは、コードが複雑になりやすく、意図が読み取りにくくなることがあります。そこでifの条件式を、age >= 20 && hasLicense && !isDrunk とまとめました。
これにより、「20歳以上」「免許を持っている」「酔っていない」という3つの条件がすべて満たされた場合に isEligible が true になります。そのとき if 文が実行され、「運転可能」と出力されます。
boolean isEligible = age >= 20 && hasLicense && !isDrunk;
if (isEligible) {
System.out.println("運転可能");
}
条件分岐:switch文
switch文の基本構文
switch文は、1つの値に応じて複数の分岐処理をわかりやすく書ける構文です。複数のif-else ifを使うよりも、条件が整理されて見やすくなるというメリットがあります。
switch (式) {
case 値1:
// 式が値1に等しい場合の処理
break;
case 値2:
// 式が値2に等しい場合の処理
break;
// 必要なだけcaseを追加
default:
// どのcaseにも該当しない場合の処理
}
具体例として曜日判定をswitch分を利用して表現します。
int dayOfWeek = 3;
String dayName;
switch (dayOfWeek) {
case 1:
dayName = "月曜日";
break;
case 2:
dayName = "火曜日";
break;
case 3:
dayName = "水曜日";
break;
case 4:
dayName = "木曜日";
break;
case 5:
dayName = "金曜日";
break;
case 6:
dayName = "土曜日";
break;
case 7:
dayName = "日曜日";
break;
default:
dayName = "無効な日";
}
System.out.println(dayName); // "水曜日"と表示
変数dayOfWeekの値に応じて、対応する曜日の文字列をdayNameに代入しています。ここではdayOfWeekが3のため、case 3:が実行され、dayNameに「水曜日」が代入されます。break文は、目的のcaseが実行されたあとに他のcaseへ処理が流れないようにするために必要です。
もしどのcaseにも該当しない場合は、defaultが実行され、「無効な日」が設定されます。最後にSystem.out.println(dayName);によって、「水曜日」と出力されます。switch文を使うことで、複数の条件分岐を簡潔かつ見やすく記述できます。
break文の重要性
switch文では、各caseブロックの最後にbreakを記述しないと、次のcaseブロックも実行されてしまいます。
例えば次のコードにて、変数numの値が2なので、case 2:から処理が始まります。しかし、break文が書かれていないため、case 2の後もそのまま次のcase 3、さらにdefaultまで連続して実行**されます。結果として、コンソールには以下の3行が出力されます。
int num = 2;
switch (num) {
case 1:
System.out.println("1");
case 2:
System.out.println("2"); // 実行される
case 3:
System.out.println("3"); // breakがないためこれも実行される
default:
System.out.println("default"); // これも実行される
}
// 出力結果:
// 2
// 3
// default
このような動作を**フォールスルー(fall-through)**と呼びます。通常は意図しない連続実行を防ぐために、各caseの末尾にbreakを付けます。ただし、複数のcaseで同じ処理を行いたい場合など、あえてフォールスルーを利用することもあります。
拡張switch式
Java 12以降では、より簡潔なswitch式が導入されました。
ここでは、変数dayOfWeekの値に応じて、dayTypeに「平日」「週末」「無効」のいずれかの文字列を代入しています。たとえば、dayOfWeekが3であれば"平日"、6であれば"週末"が返されます。caseの後にカンマで複数の値を指定でき、->(アロー)で処理内容を簡潔に書けるのがポイントです。
String dayType = switch (dayOfWeek) {
case 1, 2, 3, 4, 5 -> "平日";
case 6, 7 -> "週末";
default -> "無効";
};
また、従来のbreakやreturnを使う必要がなく、安全で明確な分岐処理が可能です。
このスイッチ式により、if-elseよりも短く、読みやすく、エラーの少ない条件分岐を書くことができます。
switch文 vs if文
switch文とif文はいずれも条件分岐を行うための構文ですが、目的や得意とする場面が異なります。どちらも「条件によって処理を変える」点は同じです。しかし構造や使いやすさの観点から使い分けを意識すると、コードがより読みやすく、効率的になります。
| 特徴 | switch文 | if文 |
|---|---|---|
| 適した場面 | 単一変数の値による分岐 | 複雑な条件式が必要な場合 |
| 可読性 | 値による分岐が明確 | 条件式が柔軟 |
| パフォーマンス | ジャンプテーブル使用で高速な場合あり | 条件評価が必要 |
| 使用可能な型 | 整数型、文字型、文字列型、enum | すべてのboolean条件 |
セミコロンの誤配置
if文の直後に誤ってセミコロン(;)を付けてしまった例です。このようなミスは見た目では気づきにくく、意図しない動作を引き起こす原因になります。
if (condition); { // セミコロンがあるとif文が終了してしまう
System.out.println("常に実行される");
}
if (condition);の部分でif文がそこで終了してしまうため、後ろのブロック { ... } はifとは無関係な通常の処理として実行されます。つまり、conditionがtrueでもfalseでも関係なく、System.out.println("常に実行される");が必ず実行されてしまいます。if文の末尾にセミコロンを付けないよう注意することが重要です。
まとめ
if文は条件によって処理を分け、switch文は変数の値に応じて複数の分岐を実現します。状況に応じてこれらを使い分けることで、コードの可読性と効率が向上します。制御構造はプログラミングの基礎であり、実際に手を動かして練習することが理解を深める近道です。まずは簡単な例から始め、段階的に複雑な処理に挑戦していきましょう。
演習問題
初級レベル(3問)
問題1:基本的なif文
// 整数変数scoreが60以上の場合「合格」、それ以外の場合「不合格」と表示するプログラムを作成してください
public class Main {
public static void main(String[] args) {
int score = 75;
// ここにif文を記述
}
}
問題2:if-else if-else文
// 整数変数temperatureの値に応じて以下のように表示するプログラムを作成してください
// 30以上: "Hot", 20以上30未満: "Warm", 20未満: "Cool"
public class Main {
public static void main(String[] args) {
int temperature = 25;
// ここにif-else if-else文を記述
}
}
問題3:基本的なswitch文
// 整数変数day(1-7)の値に応じて曜日を表示するswitch文を作成してください
// 1: "Monday", 2: "Tuesday", ..., 7: "Sunday"
public class Main {
public static void main(String[] args) {
int day = 3;
// ここにswitch文を記述
}
}
中級レベル(6問)
問題4:論理演算子を使用したif文
// 整数変数ageが18以上かつboolean変数hasLicenseがtrueの場合「運転可能」、
// それ以外の場合「運不可」と表示するプログラムを作成してください
public class Main {
public static void main(String[] args) {
int age = 20;
boolean hasLicense = true;
// ここにif文を記述
}
}
問題5:三項演算子の使用
// if文の代わりに三項演算子を使用して、整数変数numが偶数なら"Even"、奇数なら"Odd"と表示してください
public class Main {
public static void main(String[] args) {
int num = 7;
// ここに三項演算子を使用したコードを記述
}
}
問題6:switch文での複数caseの統合
// 整数変数monthの値に応じて季節を表示するswitch文を作成してください
// 12,1,2: "Winter", 3,4,5: "Spring", 6,7,8: "Summer", 9,10,11: "Autumn"
public class Main {
public static void main(String[] args) {
int month = 4;
// ここにswitch文を記述
}
}
問題7:配列とif文の組み合わせ
// 整数配列scoresの中で、60点以上の要素の数を数えて表示するプログラムを作成してください
public class Main {
public static void main(String[] args) {
int[] scores = {85, 42, 67, 90, 55, 78};
int count = 0;
// ここにfor文とif文を組み合わせたコードを記述
System.out.println("合格者数: " + count);
}
}
問題8:文字列の比較とswitch文
// 文字列変数colorの値に応じて以下のように表示するswitch文を作成してください
// "red": "Stop", "yellow": "Caution", "green": "Go", それ以外: "Unknown"
public class Main {
public static void main(String[] args) {
String color = "green";
// ここにswitch文を記述(Java 14以降のswitch式を使用可)
}
}
問題9:ネストしたif文
// 整数変数x, y, zの中で最大値を求めるプログラムを、if文のネストを使用して作成してください
public class Main {
public static void main(String[] args) {
int x = 15, y = 22, z = 18;
int max;
// ここにネストしたif文を記述
System.out.println("最大値: " + max);
}
}
上級レベル(3問)
問題10:配列の要素チェックと条件分岐
// 整数配列numbersの中に負の数が含まれているかどうかを判定するプログラムを作成してください
// 負の数が1つでもあれば"Negative numbers found"、なければ"All positive"と表示
public class Main {
public static void main(String[] args) {
int[] numbers = {5, 12, -3, 8, 20};
boolean hasNegative = false;
// ここにコードを記述
}
}
問題11:複雑な条件分岐と型変換
// double型の配列temperaturesから、以下の条件を満たす要素の数を数えて表示してください
// 条件: 温度が0度未満 または 35度超過
public class Main {
public static void main(String[] args) {
double[] temperatures = {-2.5, 15.0, 38.7, 25.3, -5.0, 40.1};
int extremeCount = 0;
// ここにコードを記述
System.out.println("極端な気温の数: " + extremeCount);
}
}
問題12:switch式(Java 14以降)の使用
// switch式を使用して、整数変数grade(1-5)を文字列評価に変換してください
// 1: "Poor", 2: "Fair", 3: "Good", 4: "Very Good", 5: "Excellent"
// 結果をString変数evaluationに代入して表示
public class Main {
public static void main(String[] args) {
int grade = 4;
String evaluation;
// ここにswitch式を記述
System.out.println("評価: " + evaluation);
}
}
初級レベル(3問)解答例
問題1 解答例
// 整数変数scoreが60以上の場合「合格」、それ以外の場合「不合格」と表示するプログラムを作成してください
public class Main {
public static void main(String[] args) {
int score = 75;
if (score >= 60) {
System.out.println("合格");
} else {
System.out.println("不合格");
}
}
}
問題2 解答例
// 整数変数temperatureの値に応じて以下のように表示するプログラムを作成してください
// 30以上: "Hot", 20以上30未満: "Warm", 20未満: "Cool"
public class Main {
public static void main(String[] args) {
int temperature = 25;
if (temperature >= 30) {
System.out.println("Hot");
} else if (temperature >= 20) {
System.out.println("Warm");
} else {
System.out.println("Cool");
}
}
}
問題3 解答例
// 整数変数day(1-7)の値に応じて曜日を表示するswitch文を作成してください
// 1: "Monday", 2: "Tuesday", ..., 7: "Sunday"
public class Main {
public static void main(String[] args) {
int day = 3;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
case 4:
System.out.println("Thursday");
break;
case 5:
System.out.println("Friday");
break;
case 6:
System.out.println("Saturday");
break;
case 7:
System.out.println("Sunday");
break;
default:
System.out.println("Invalid day");
}
}
}
中級レベル(6問)解答例
問題4 解答例
// 整数変数ageが18以上かつboolean変数hasLicenseがtrueの場合「運転可能」、
// それ以外の場合「運不可」と表示するプログラムを作成してください
public class Main {
public static void main(String[] args) {
int age = 20;
boolean hasLicense = true;
if (age >= 18 && hasLicense) {
System.out.println("運転可能");
} else {
System.out.println("運転不可");
}
}
}
問題5 解答例
// if文の代わりに三項演算子を使用して、整数変数numが偶数なら"Even"、奇数なら"Odd"と表示してください
public class Main {
public static void main(String[] args) {
int num = 7;
String result = (num % 2 == 0) ? "Even" : "Odd";
System.out.println(result);
}
}
問題6 解答例
// 整数変数monthの値に応じて季節を表示するswitch文を作成してください
// 12,1,2: "Winter", 3,4,5: "Spring", 6,7,8: "Summer", 9,10,11: "Autumn"
public class Main {
public static void main(String[] args) {
int month = 4;
switch (month) {
case 12:
case 1:
case 2:
System.out.println("Winter");
break;
case 3:
case 4:
case 5:
System.out.println("Spring");
break;
case 6:
case 7:
case 8:
System.out.println("Summer");
break;
case 9:
case 10:
case 11:
System.out.println("Autumn");
break;
default:
System.out.println("Invalid month");
}
}
}
問題7 解答例
// 整数配列scoresの中で、60点以上の要素の数を数えて表示するプログラムを作成してください
public class Main {
public static void main(String[] args) {
int[] scores = {85, 42, 67, 90, 55, 78};
int count = 0;
for (int i = 0; i < scores.length; i++) {
if (scores[i] >= 60) {
count++;
}
}
System.out.println("合格者数: " + count);
}
}
問題8 解答例
// 文字列変数colorの値に応じて以下のように表示するswitch文を作成してください
// "red": "Stop", "yellow": "Caution", "green": "Go", それ以外: "Unknown"
public class Main {
public static void main(String[] args) {
String color = "green";
// 従来のswitch文
switch (color) {
case "red":
System.out.println("Stop");
break;
case "yellow":
System.out.println("Caution");
break;
case "green":
System.out.println("Go");
break;
default:
System.out.println("Unknown");
}
// Java 14以降のswitch式(別解)
/*
String message = switch (color) {
case "red" -> "Stop";
case "yellow" -> "Caution";
case "green" -> "Go";
default -> "Unknown";
};
System.out.println(message);
*/
}
}
問題9 解答例
// 整数変数x, y, zの中で最大値を求めるプログラムを、if文のネストを使用して作成してください
public class Main {
public static void main(String[] args) {
int x = 15, y = 22, z = 18;
int max;
if (x > y) {
if (x > z) {
max = x;
} else {
max = z;
}
} else {
if (y > z) {
max = y;
} else {
max = z;
}
}
System.out.println("最大値: " + max);
}
}
上級レベル(3問)解答例
問題10 解答例
// 整数配列numbersの中に負の数が含まれているかどうかを判定するプログラムを作成してください
// 負の数が1つでもあれば"Negative numbers found"、なければ"All positive"と表示
public class Main {
public static void main(String[] args) {
int[] numbers = {5, 12, -3, 8, 20};
boolean hasNegative = false;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] < 0) {
hasNegative = true;
break; // 1つ見つかったらループを抜ける
}
}
if (hasNegative) {
System.out.println("Negative numbers found");
} else {
System.out.println("All positive");
}
}
}
問題11 解答例
// double型の配列temperaturesから、以下の条件を満たす要素の数を数えて表示してください
// 条件: 温度が0度未満 または 35度超過
public class Main {
public static void main(String[] args) {
double[] temperatures = {-2.5, 15.0, 38.7, 25.3, -5.0, 40.1};
int extremeCount = 0;
for (int i = 0; i < temperatures.length; i++) {
if (temperatures[i] < 0 || temperatures[i] > 35) {
extremeCount++;
}
}
System.out.println("極端な気温の数: " + extremeCount);
}
}
問題12 解答例
// switch式を使用して、整数変数grade(1-5)を文字列評価に変換してください
// 1: "Poor", 2: "Fair", 3: "Good", 4: "Very Good", 5: "Excellent"
// 結果をString変数evaluationに代入して表示
public class Main {
public static void main(String[] args) {
int grade = 4;
String evaluation;
// Java 14以降のswitch式
evaluation = switch (grade) {
case 1 -> "Poor";
case 2 -> "Fair";
case 3 -> "Good";
case 4 -> "Very Good";
case 5 -> "Excellent";
default -> "Invalid grade";
};
System.out.println("評価: " + evaluation);
// 従来のswitch文を使用する場合(別解)
/*
switch (grade) {
case 1:
evaluation = "Poor";
break;
case 2:
evaluation = "Fair";
break;
case 3:
evaluation = "Good";
break;
case 4:
evaluation = "Very Good";
break;
case 5:
evaluation = "Excellent";
break;
default:
evaluation = "Invalid grade";
}
System.out.println("評価: " + evaluation);
*/
}
}