Java/基礎/条件分岐

「条件分岐」は、プログラミングにおいて重要な概念の一つです。条件分岐を使うことで、プログラムは特定の条件に応じて異なる処理を実行することができます。
この章では、Javaでの条件分岐の基本的な使い方から、より高度な使い方までを解説します。if-else文、switch文、switch式、論理演算子、三項演算子など、様々な種類の条件分岐について学ぶことができます。また、例外処理における条件分岐の使い方についても解説します。
各セクションでは、実際のコード例を使って、どのように条件分岐を使えばよいかを説明します。また、練習問題も用意していますので、理解を深めるために挑戦してみてください。
条件分岐は、プログラムの制御構造を理解する上で重要な概念です。本章を通して、条件分岐の基本的な使い方から応用までを学び、プログラムの制御構造を理解してください。
Javaのif-else文は、プログラムの流れを条件分岐させるための文です。条件に応じて実行される文を切り替えることができます。
if文は、指定された条件が真である場合に実行される文を指定します。if文が偽である場合に実行される文を指定するために、else節を組み合わせて使うことができます。
if-else文の基本構文は以下の通りです。
条件式は、真偽値を返す式です。もし条件式が真であれば、if文の中の文が実行され、偽であればelse節の中の文が実行されます。
また、else節は省略することができます。省略した場合、条件式が偽である場合には何も実行されません。
複数の条件を判定する場合には、else if節を使うことができます。
複数の条件を判定する場合には、if-else文をネストして使うこともできます。
このコードは、if-else文を使って変数nが負の数、正の数、零、またはNaN(非数)であるかを判定しています。
まず、変数nに0.0を0.0で割った結果を代入しています。0.0を0.0で割るとNaNになるため、この変数はNaNになります。
次に、if-else文を使って、nが負の数、正の数、零、またはNaNであるかを判定しています。
まず、n < 0.0という条件を使って、nが負の数であるかを判定しています。もしnが負の数であれば、System.out.println("負の数です");が実行されます。
次に、n > 0.0という条件を使って、nが正の数であるかを判定しています。もしnが正の数であれば、System.out.println("正の数です。");が実行されます。
次に、n == 0.0という条件を使って、nが零であるかを判定しています。もしnが零であれば、System.out.println("零です。");が実行されます。
最後に、else節を使って、nがNaNであるかを判定しています。NaNはどの数とも等しくならないため、n == 0.0やn < 0.0、n > 0.0のいずれの条件も成立しないため、else節が実行されます。else節では、nの値をそのまま表示するSystem.out.println(n + "です。");が実行されます。
このように、if-else文を使うことで、複数の条件を判定し、条件に応じた処理を行うことができます。
Javaのswitch文は、複数の条件分岐を処理するための構文です。特定の変数の値をチェックし、その値に応じて分岐することができます。
基本的な構文は以下の通りです。
式には、チェックする式を指定します。各caseには、変数が持つ値が一致する場合に実行される処理を記述します。defaultには、上記のいずれの値にも一致しない場合に実行される処理を記述します。
式には、数値以外に文字列も使うことが出来ます。
以下は、Javaのswitch文で文字列型を使用した例です。
この例では、変数fruitに文字列型の「りんご」が代入されています。switch文の条件式であるswitch (fruit)では、文字列型の変数fruitを使用しています。
switch文のcaseラベルには、文字列型の定数をカンマで区切って列挙しています。 また、caseラベルで果物として認識する文字列は、同じ文の中に複数記述することができます。 break文を使用して、該当するcaseラベルにマッチした場合は、それに続く文を実行するようにしています。
また、Javaのswitch文では、Enumを使った網羅性の確保ができます。Enumは、プログラムで扱う定数を列挙するためのクラスです。
以下は、Enumを使ったswitch文の例です。
この例では、AnimalというEnumを定義し、それを使って動物の鳴き声を出力するプログラムを書いています。switch文のcaseには、Enumの要素を列挙しています。
switch文は、if文と比べて複数の条件分岐をスッキリと書くことができるため、コードの可読性が向上するという利点があります。
Java 12から、Javaにはswitch式という新しい構文が導入されました。switch式は、通常のswitch文と同様に、複数の値の比較に基づいて異なるコードブロックを実行するために使用されますが、式の値を返すこともできます。
switch式は、通常のswitch文と同じように、いくつかのcaseブロックを持ちます。ただし、switch式では、個々のcaseラベルに式を直接使用できます。また、値を返すことができるため、式の値を変数に代入することもできます。
Javaのswitch式の構文は以下の通りです。
なお、switch式はJava 12から導入された新しい機能であり、以前のバージョンのJavaでは使用できません。
以下は、switch式の例です。
この例では、変数fruitに文字列型の「りんご」が代入されています。switch式では、変数fruitを評価しています。caseラベルには、直接式を使用しています。caseラベルで果物として認識する文字列は、同じ文の中にカンマで区切って複数記述することができます。->演算子を使用して、各caseラベルの式を実行します。
switch式の最後には、値を返すことができます。この例では、式の結果を変数resultに代入しています。最後に、変数resultの値を出力しています。
Javaにおいて、条件式は比較演算子や論理演算子を用いて、複数の条件を組み合わせた式を表現することができます。論理演算子は、2つのブーリアン値(trueまたはfalse)を受け取り、新しいブーリアン値を返します。
Javaには、5つの論理演算子があります。
Javaの三項演算子は、条件式 ? 式1 : 式2 の形式を持ちます。この演算子は、条件式が true の場合は式1を、falseの場合は式2を評価して返します。例えば、以下のようなコードが考えられます。
このコードでは、aとbの値を比較して、aがbよりも大きければaを、そうでなければbを最大値として選択します。 三項演算子を使って、if文を使う代わりに簡潔に書くことができます。 ただし、三項演算子は条件式と2つの式のみを評価するので、複雑な条件分岐を行う場合にはif文を使用することが推奨されます。
Java 16で導入されたパターンマッチング式(Pattern Matching for instanceof)は、Java言語の制御構造の一つです。
通常、オブジェクトの型を判定するためには instanceof 演算子を使用します。パターンマッチング式は、この instanceof 演算子をより簡潔かつ安全に使用できるようにしたものです。
例えば、次のようなコードがあります。
このコードは、オブジェクトが String クラスのインスタンスである場合に、そのオブジェクトを String 型にキャストして大文字に変換し、標準出力に出力するという処理を行っています。
パターンマッチング式を使用すると、このコードを次のように書き換えることができます。
このコードでは、オブジェクトが String クラスのインスタンスである場合に、そのオブジェクトを String 型にキャストせずに、変数 str に直接代入しています。また、変数 str は if 文の中でのみ有効なローカル変数となります。
このように、パターンマッチング式を使用することで、より簡潔で安全なコードを書くことができます。
switchのパターンマッチング拡張とは、Javaプログラミング言語において、switch文やswitch式においてパターンを使用して条件を指定できるようにする機能です。通常のswitch文やswitch式では、一致する値の厳密な等式比較しか行えませんでしたが、パターンマッチング拡張により、より柔軟な条件指定が可能になります。
具体的には、switch文やswitch式のケースラベルで、従来の定数だけでなく、パターンも指定できるようになります。これにより、オブジェクトの型や構造に基づいて条件を指定することができます。例えば、オブジェクトが特定の型であるか、あるいは特定のフィールドの値を持つかどうかなどの条件を指定することができます。
これにより、従来は複雑だった複数の条件分岐を一つのswitch文やswitch式で表現することができるようになり、コードの可読性が向上します。また、パターンマッチングにより、より安全な条件指定が可能になります。
以下は、Java 21で導入されたswitch文のパターンマッチング拡張を使用したコード例です。
この例では、formatterPatternSwitchメソッド内で、switch文を使用してobjの型に基づいて処理を分岐しています。各ケースラベルでは、オブジェクトが特定の型にマッチするかどうかをパターンで指定しています。例えば、case Integer iでは、objがInteger型にマッチする場合、iというパターン変数が導入され、その値がint %dのフォーマット文字列に埋め込まれます。他の型についても同様の処理が行われます。
このように、switch文のパターンマッチング拡張を使用することで、よりシンプルで効率的なコードを記述することができます。
以下は、Java 21で導入されたswitch文のパターンマッチング拡張で使用できるパターンの一覧を表形式で示したものです。
これらのパターンを使用して、switch文やswitch式のケースラベルで条件分岐を行うことができます。それぞれのパターンは、特定の条件にマッチするかどうかをチェックするために使用されます。