この記事では、Java言語における条件分岐の基本的な構文であるif文とswitch文について、初心者にもわかりやすく解説します。if文の基本的な使い方から複雑な条件分岐、そしてswitch文の基本から最新のJava 21での拡張機能まで、幅広くカバーしています。
はじめに
この記事のコードをコピペしてEclipseでどういう出力結果がでるのか確認してみよう!
条件分岐(if文)
基本的なif文
if文の最も基本的な形式は次のとおりです:
if (条件式) {
// 条件が真の場合に実行される処理
}
条件式がtrueと評価された場合のみ、中括弧{}内のコードブロックが実行されます。
if-else文
条件が偽の場合の処理も指定したい場合は、if-else文を使用します:
if (条件式) {
// 条件が真の場合に実行される処理
} else {
// 条件が偽の場合に実行される処理
}
この形式では、条件が偽の場合にelse以下のブロックが実行されます。
複数の条件分岐(if-else if-else文)
より複雑な条件分岐を行う場合は、if-else if-else文を使用します:
if (条件式1) {
// 条件1が真の場合の処理
} else if (条件式2) {
// 条件2が真の場合の処理
} else if (条件式3) {
// 条件3が真の場合の処理
} else {
// どの条件も満たさない場合の処理
}
この構造では、条件式が上から順に評価され、最初に真となった条件のブロックが実行されます。
ネストされたif文
if文は他のif文の中にネストすることも可能です:
if (条件式1) {
if (条件式2) {
// 条件1と2が両方真の場合の処理
} else {
// 条件1は真だが、条件2は偽の場合の処理
}
} else {
// 条件1が偽の場合の処理
}
注意点:
- 条件式は必ずboolean型(trueまたはfalse)を返す必要があります。
- 単一の文を実行する場合は中括弧{}を省略できますが、可読性のために常に使用することが推奨されます。
- 複数の条件を評価する場合、条件の順序が重要です。最も具体的または頻繁に発生する条件を最初に配置すると、効率的なコードになります。
- 複雑な条件分岐の場合は、switch文の使用を検討することも有効です。
条件式
if文の条件式には、通常、比較演算子や論理演算子を使用します:
- 比較演算子:
==
,!=
,<
,>
,<=
,>=
- 論理演算子:
&&
(AND),||
(OR),!
(NOT)
int age = 25;
if (age >= 20) {
System.out.println("成人です。");
} else {
System.out.println("未成年です。");
}
出力結果:
成人です。
if文は、プログラムの流れを制御する基本的なツールです。適切に使用することで、柔軟で効率的なプログラムを作成することができます。
if文:プログラム例
このプログラムは、点数に基づいて成績を判定し、適切なメッセージを表示する簡単な例です。
// 変数scoreを宣言し、値85を代入します
int score = 85;
// scoreの値に基づいて成績を判定します
// if-else if文を使用して、scoreの値を異なる範囲と比較します
// もしscoreが90以上なら
if (score >= 90) {
System.out.println("成績は優秀です。");
}
// もしscoreが70以上90未満なら
else if (score >= 70) {
System.out.println("成績は良いです。");
}
// もしscoreが50以上70未満なら
else if (score >= 50) {
System.out.println("成績は合格です。");
}
// もしscoreが50未満なら
else {
System.out.println("成績は不合格です。");
}
// このプログラムでは、score = 85なので、「成績は良いです。」が表示されます
出力結果:
成績は良いです。
解説:
if
の後の括弧内に条件式を記述します。- 条件が真の場合、対応する中括弧
{}
内のコードが実行されます。 else if
を使用して複数の条件を追加できます。else
は全ての条件が偽の場合に実行されます。
実際の成績判定システムではより複雑な条件や処理が必要かもしれませんが、この例は条件分岐の基本的な使い方です。
条件分岐(switch文)
基本的なswitch文
switch文は、複数の条件分岐を簡潔に記述するための制御構造です。
switch (式) {
case 値1:
// 処理1
break;
case 値2:
// 処理2
break;
// ...
default:
// デフォルトの処理
}
- 式の型: int、char、byte、short、enum、String(Java 7以降)が使用可能です。
- break文: 各caseの最後にbreak文を記述しないと、次のcaseの処理も実行されます(フォールスルー)。
- 定数式: caseラベルには定数式のみ使用可能です。変数は使用できません。
- default: どのcaseにも一致しない場合に実行されます。省略可能ですが、通常は記述することが推奨されます。
switch文:プログラム例
曜日の表示
int day = 3; // 曜日を表す数値(1: 月曜日, 2: 火曜日, ...)
switch (day) { // dayの値に基づいて分岐
case 1:
System.out.println("月曜日");
break; // このcaseの処理を終了し、switch文を抜ける
case 2:
System.out.println("火曜日");
break;
case 3:
System.out.println("水曜日");
break;
// ... 他の曜日
default: // どのcaseにも一致しない場合
System.out.println("無効な日付");
}
出力結果:
水曜日
全体の動作:
day
の値(この場合は3)がswitch文に渡されます。- 各caseが順番にチェックされます。
case 3:
に一致するため、”水曜日” が出力されます。break;
文によりswitch文が終了します。default
ケースで不正な入力を処理しています。
注意点:
- 各caseの後の
break;
は重要です。これがないと、次のcaseの処理も続けて実行されてしまいます(フォールスルー)。 default:
は必須ではありませんが、予期しない値に対処するために使用するのが一般的です。
このコードは、数値で表された曜日を対応する曜日名に変換する簡単な例です。
曜日の表示(フォールスルーを利用)
int day = 3;
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("平日です"); // 1から5の場合、この処理が実行される
break;
case 6:
case 7:
System.out.println("週末です"); // 6または7の場合、この処理が実行される
break;
default:
System.out.println("無効な日付です");
}
出力結果:
平日です
全体の動作:
day
の値(この場合は3)がswitch文に渡されます。case 3:
に一致するため、処理はそこから開始されます。break
文がないため、処理は次の行に進み、”平日です”が出力されます。- その後の
break
文によりswitch文が終了します。
このコードの特徴:
- フォールスルーの効果的な使用: 複数の条件(この場合は曜日)に対して同じ処理を行う際に、コードを簡潔にしています。
- 論理的なグループ化: 平日(1-5)と週末(6-7)を分けて処理しています。
- エラー処理:
default
ケースで不正な入力を処理しています。
このコードは、数値で表された曜日を「平日」か「週末」かに分類する簡潔な例となっています。フォールスルーを適切に使用することで、コードの冗長性を減らし、可読性を高めています。
Java 12での拡張: switch式
Java 12では、switch式が導入され、より簡潔な記述が可能になりました。
int day = 3;
String dayType = switch (day) {
case 1, 2, 3, 4, 5 -> "平日"; // 複数の値を1つのcaseで処理
case 6, 7 -> "週末";
default -> "無効な日付";
};
System.out.println(dayType); // 結果を出力
出力結果:
平日
主な特徴
- アロー構文:
->
を使用して、caseとその処理を1行で記述できます。 - break文の省略: アロー構文を使用する場合、breakを書く必要がなくなりました。
- 複数のcase値: カンマで区切って複数の値を1つのcaseに指定できます。
- 値の返却: switch式全体で値を返すことができます。
このコードは、数値で表された曜日を「平日」「週末」「無効な日付」のいずれかに分類する簡潔で効率的な例となっています。Java 12以降の新しいswitch式の特徴を活かし、従来のswitch文よりも簡潔で読みやすいコードを実現しています。
Java 21での拡張: パターンマッチングfor switch
※「Java 21 LTS」は高度な条件分岐ができますが、初心者の方はswitch文の基本が理解できていれば問題ありません。基本的なswitch文の使い方をしっかり理解した上で、徐々に新しい機能を学んでいくことをお勧めします。
static String processShape(Shape shape) {
return switch (shape) {
case null -> "形状がnullです"; // nullの明示的な処理
case Circle c -> "円の半径: " + c.radius(); // 型パターン
case Rectangle r when r.width() == r.height() ->
"正方形の辺の長さ: " + r.width(); // ガード条件
default -> "未知の形状です"; // デフォルトケース
};
}
主な特徴
- 型パターン: オブジェクトの型に基づいて分岐できます。
- ガード条件:
when
キーワードを使用して、追加の条件を指定できます。 - パターンの網羅性チェック: コンパイラが、すべての可能なケースが処理されているかをチェックします。
- nullケースの処理: nullを明示的に処理できます。
このコードは Java 21 で導入されたパターンマッチングfor switchの機能を使用しています。詳細な解説を以下に記します:
static String processShape(Shape shape) {
processShape
という静的メソッドを定義しています。- 引数として
Shape
型のshape
を受け取り、String
型の結果を返します。
return switch (shape) {
- switch式を使用して、
shape
オブジェクトの型と状態に基づいて分岐処理を行います。
case null -> "形状がnullです"; // nullの明示的な処理
- nullの明示的な処理:
shape
がnull
の場合、この処理が実行されます。 - Java 21以前では、switch文で
null
を直接扱うことはできませんでした。
case Circle c -> "円の半径: " + c.radius(); // 型パターン
- 型パターン:
shape
がCircle
クラスのインスタンスの場合、この処理が実行されます。 c
という変数に自動的にキャストされ、radius()
メソッドを直接呼び出せます。
case Rectangle r when r.width() == r.height() ->
"正方形の辺の長さ: " + r.width(); // ガード条件
- 型パターンとガード条件の組み合わせ:
shape
がRectangle
クラスのインスタンスの場合、このケースが評価されます。when
キーワードの後に追加の条件(ガード条件)が指定されています。- 幅と高さが等しい場合(正方形の場合)のみ、この処理が実行されます。
r.width()
を使用して正方形の辺の長さを返します。
default -> "未知の形状です"; // デフォルトケース
- 上記のどのcaseにも一致しない場合(他の形状クラスのインスタンスの場合)、この処理が実行されます。
};
- switch式の終了を示します。
このコードの特徴と利点:
- 型安全性: コンパイル時に型チェックが行われ、型の不一致によるランタイムエラーを防ぎます。
- 網羅性: コンパイラが全ての可能性(null含む)が処理されているかチェックします。
- 簡潔性: 従来のinstanceofと型キャストを使用する方法と比べて、非常に簡潔に書けます。
- ガード条件: 型チェックに加えて、追加の条件を指定できます。
- nullの扱い: nullを明示的に扱えるため、NullPointerExceptionを防ぐことができます。
- 可読性: コードの意図が明確になり、理解しやすくなります。
このコードは、様々な形状オブジェクトを効率的に処理し、それぞれの特性に応じた情報を返す高度な例となっています。Java 21の新機能を活用することで、型安全で簡潔、かつ表現力豊かなコードを実現しています。
まとめ
- if文は最も基本的な条件分岐の方法で、単純な条件から複雑な条件まで柔軟に対応できます。
- else ifを使用することで、複数の条件を順次チェックする分岐を実装できます。
- ネストされたif文を使用すると、より複雑な条件分岐を表現できますが、可読性に注意が必要です。
- switch文は、特定の変数の値に基づいて分岐を行う際に便利で、特に列挙型や整数値での分岐に適しています。
- Java 12以降では、switch式が導入され、より簡潔で表現力豊かな記述が可能になりました。
- Java 21では、パターンマッチングを使用したswitch文が導入され、より柔軟な条件分岐が可能になりました。
条件分岐は、プログラミングの基本的かつ重要な概念です。if文とswitch文の適切な使用法を理解し、状況に応じて適切な構文を選択することで、より効率的で読みやすいコードを書くことができます。また、Javaの新しい機能を活用することで、より簡潔で表現力豊かなコードを書くことができるようになります。
コメント