AxiZ沖縄ブログ

エンジニア育成学校【AxiZ沖縄】のブログです。

Java基礎の補足【制御構文】

Java基礎の中でも制御構文に関する補足です。

ifとswiitchの使い分け

ifとswitchは、どちらも条件分岐で使われます。
switchはif文よりも使える場面が限られており、
またswitchでできることはifを使ってもできるので、
switchが使われる頻度はifよりも少ないです。

しかし、switchが使える場面であれば使った方が良いです。
なぜかというと、一般的にifとswitchで同じ処理が書けるのであれば、
switchの方が読みやすくなります。
また、処理の速度もifよりswitchの方が速いです。
処理速度という点では、
人が見て明らかなな差は感じないとは思いますが、
一応switchの方が仕様的に速くなるそうなので、
switchが使える場面では積極的に使っていきましょう。

中かっこの省略

Javaでは処理を書くとき、中かっこ({})で囲われた範囲を一つのブロックとします。
if文やfor文、while文を書く時にも中かっこが必要ですが、実は省略することができます。
ただし、中かっこを省略した場合は、そのあとの1文だけにif文やfor文が適用されます。
例えば

if (n > 10) 
    System.out.println("a");
    System.out.println("b");
    System.out.println("c");

こう書くと、条件によって処理されるかされないかが変わるのは"a"の部分だけ。
bとcは無条件に出力されます。
ifがforに変わっても考え方は同じです。
正直分かりにくいので、処理されるのが1行だけの場合でも中かっこは省略しないほうが良いでしょう。

forとwhileの違い

for文とwhile文は、できることに違いはないように感じます。
実際、処理を繰り返す回数が決まっている場合は、どちらを使っても実現できます。
そして、繰り返す回数があらかじめ決まっている場合は、for文を使った方が一般的には見やすいです。
では、whileの使い道はというと、繰り返す回数があらかじめ決まっていない場合です。
それはどんな場面かというと、例えば、外部からデータを読み込む場合などです。

  • テキストファイルを読み込んで、1行ずつ処理する。
  • Excelのファイルを読み込んで1行ずつ処理する。
  • データベースからデータを読み込んで、1行ずつ処理する。

このように、Javaのプログラムの外にあるものを扱おうとすると、
状況によって処理される回数などが変わります。
こういった場合は、for文では対処することが難しく、
while文を使用したほうがうまく処理できます。

論理演算子

条件式を書くとき「&&」(論理積)や「||」(論理和)を使用すると思います。
実は論理積論理和はもう一つの書き方があります。
それは「&」と「|」です。どちらも、一つずつで書きます。

違いを説明します。
AとBをそれぞれ条件式としてください。
「A && B」
とすると、Aがfalseの時、Bは評価されません。
Aがfalseの時点で全体がfalseになることが確定するからです。
一方で「A & B」
と書くと、Aがfalseだったとしても、Bも評価します。
これだけ聞くと大して影響はなさそうに見えますが、
条件式の内容によっては影響が出ます。
例えば

if (str != null && str.isEmpty()) {
    //
}

このような処理を書いたとします。
strが仮にnullだった場合上記の条件式だと、
実行してもエラーにはなりませんが、
&で書いてしまった場合は実行時エラーが発生します。
&を使用する場合はほとんどないかと思いますが、
違いを知っておきましょう。

論理和についても考え方は同じです。
「A || B」
とすると、Aがtrueだった時点で全体がtrueになることが確定するので、
Bは評価しません。
「A | B」と書くと、
AがtrueだったとしてもBも評価します。

「&&」「||」は、短絡評価の演算子とも呼ばれます。

三項演算子

三項演算子と呼ばれる条件の書き方があります。
条件演算子とも呼ばれます。
if~else文を簡潔に書く方法です。

int num = 85
String str = "";
str = num >= 80 ? "A" : "B";

「num >= 80」が条件になります。
これがtrueの時はstrには"A"が代入されます。
falseの時には"B"が代入されます。

なれないと一見すると分かりにくいです。
if~else文でも同じことができるので、無理に使う必要はなく、
むしろあまり推奨されていません。

ただし、条件によって動的に文字列を作成する場合など
(SQLによる操作をする場合など)には、
三項演算子で書いた方が簡潔で読みやすくなる場合もあるので、
状況によって使い分けれるようにしておくと良いでしょう。

文字列比較のテクニック

Javaでは文字列を比較する場合、「==」ではなく、
equalsメソッドを使用します。
equalsを使って比較する場合のテクニックを紹介します。

String str = "abc";
if (str.equals("abc")) // 1

if ("abc".equals(str)) // 2

このように、比較対象を左に書く方法と、右に書く方法があります。
感覚的には1の方法が分かりやすい感じがします。
しかし、2の書き方の方が、プログラム的には安全になります。
何故かというと、1の場合はstrにnullが入っていると、実行時エラーが発生します。
一方で、2の書き方の場合、strにnullが入っていても、
条件式がfalseになるだけで実行時エラーにはなりません。
そのため2の書き方がプログラム的には安全です。

プロジェクトによって書き方にルールがある場合もあるので、
コーディング規約によっては使えない場合もあるかもしれませんが、
テクニックとして覚えておくと良いでしょう。