こんにちは!フリーエンジニアのせきです。
Javaのswitch文の中で、defaultというキーワードを使うことができます。
この記事では、
・switch文のdefaultとは、どういった意味をもっているのか知りたい
・defaultをどういう時に使うのか知りたい
という基本的な内容から、
・switch文の式の値が、どの条件値にも当てはまらない時の処理を書きたい
・defaultで気を付けるべきフォールスルーとは何か
などの応用的な内容に関しても解説していきます。
今回はdefaultの意味と使い方をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
defaultとは
Javaで分岐処理を書く文法といえばif文です。
しかし、ある変数の値によって分岐処理を行う場合は、switch文を使うこともできます。
例えば、if文で書いた以下のコード。
if (value == 0) { System.out.println("valueは0です"); } else if (value == 1) { System.out.println("valueは1です"); } else if (value == 2) { System.out.println("valueは2です"); }
switch文だと以下のように書くことができます。
switch (value) { case 0: System.out.println("valueは0です"); break; case 1: System.out.println("valueは1です"); break; case 2: System.out.println("valueは2です"); break; }
switch文で書いた方が、コードが見やすくありませんか?
では、以下のif文はどうでしょう?
if (value == 0) { System.out.println("valueは0です"); } else if (value == 1) { System.out.println("valueは1です"); } else if (value == 2) { System.out.println("valueは2です"); } else { System.out.println("valueは0でも1でも2でもありません"); }
valueの値が0でも1でも2でもない場合の処理を、else文を使って書いています。
この、値がどの条件値にも当てはまらない場合の処理を、switch文で書きたい時に使うのがdefaultです。
使ってみる
上のif文は、switch文で以下のように書くことができます。
switch (value) { case 0: System.out.println("valueは0です"); break; case 1: System.out.println("valueは1です"); break; case 2: System.out.println("valueは2です"); break; default: System.out.println("valueは0でも1でも2でもありません"); break; }
valueの値が0でも1でも2でもない場合、「default:」の位置に処理が移ります。
そして、その後に書かれた処理が実行されていきます。
valueが3の場合の実行結果
valueは0でも1でも2でもありません
どの条件値にも当てはまらない場合の処理がなければ、default文は書かなくても構いません。
実践での注意点
switch文を使うときには、フォールスルーに気を付けなければいけません。
フォールスルーとは、case文のbreakを省略した書き方です。
breakは、次のcase文の処理を実行したくない場合に記述します。
そのため、次のcase文の処理を続けて実行したい場合には、breakを省略します。
以下のコードは、どのような動きをするでしょうか?
switch (value) { case 0: case 1: System.out.println("valueは0または1です"); break; case 2: System.out.println("valueは2です"); break; default: System.out.println("valueは0でも1でも2でもありません"); break; }
valueが0の場合の実行結果
valueは0または1です
valueが1の場合の実行結果
valueは0または1です
valueが2の場合の実行結果
valueは2です
valueが3の場合の実行結果
valueは0でも1でも2でもありません
この例のフォールスルーは、コードも見やすく問題ありませんが、
次のフォールスルーはどうでしょうか?
switch (value) { case 0: System.out.println("valueは0です"); case 1: System.out.println("valueは1です"); case 2: System.out.println("valueは2です"); break; default: System.out.println("valueは0でも1でも2でもありません"); break; }
valueが0の場合の実行結果
valueは0です valueは1です valueは2です
valueが1の場合の実行結果
valueは1です valueは2です
valueが2の場合の実行結果
valueは2です
valueが3の場合の実行結果
valueは0でも1でも2でもありません
このように書くと処理が途端に複雑になり、コードを見たときにbreakを意図的に書いていないのか、書き忘れてしまったのか、区別がつきづらくバグの原因となります。
さらに、以下のコードはどうでしょうか?
switch (value) { default: System.out.println("valueは0でも1でも2でもありません"); case 0: System.out.println("valueは0です"); case 1: System.out.println("valueは1です"); case 2: System.out.println("valueは2です"); break; }
valueが0の場合の実行結果
valueは0です valueは1です valueは2です
valueが1の場合の実行結果
valueは1です valueは2です
valueが2の場合の実行結果
valueは2です
valueが3の場合の実行結果
valueは0でも1でも2でもありません valueは0です valueは1です valueは2です
どの値にも当てはまらない場合の処理を書くためのdefaultが、フォールスルーで意味のないものになっています。
フォールスルーはバグの原因となり危険なため、他のプログラミング言語では記述できない仕様になっているものもあります。
フォールスルーを使用する場合は、最新の注意を払う必要があります。
switch文の使い方総まとめ
switch文の使い方についてさらに詳しく知りたいときはこちらの記事を確認してください!
まとめ
今回はswitch文のdefaultについて解説しました。
分岐処理のコードをわかりすくしてくれる便利なswitch文ですが、フォールスルーには注意してくださいね。
もしdefaultの使い方、フォールスルーの動きを忘れてしまったら、この記事を思い出して下さい!