連載
» 2008年04月15日 00時00分 公開

携帯アプリを作って学ぶJava文法の基礎(4):コメントと制御文でJavaプログラムに“命”を吹き込め! (1/3)

[緒方聡,エスマテック株式会社]

 前回の「“たい焼き”であま〜く理解するJava文法と言語仕様」では、クラスフィールドメソッドを学習しました。そして、メソッドがJavaプログラムを動かすための処理であることも覚えてもらったと思います。

 今回からはメソッドの内部に踏み込み、Javaの必須知識を習得しつつ、ケータイ(本連載では、携帯電話PHSスマートフォンなどの端末をまとめて「ケータイ」と表記します)Javaのポイントも押さえていきます。

「コメント」を付けることは初心者にとっても大事

 今回の本題に入る前に、小さいけれど大事な「コメント」について説明します。コメントというのは、ソースコードにメモや説明などを書くために用意されている機能です。Javaには3種類のコメント形式が用意されています。

 コメント部分はプログラムの対象外になります。「ラインコメント」(1行コメント)はコードの説明に、「ブロックコメント」(従来のコメント)は、主にコードをコメントアウトするために、「Javadocコメント」(ドキュメンテーションコメント)はJavadocを記述するために使用される傾向が高いです。

表 Javaのコメント形式
名称/主な呼び方 コメント範囲
1行コメント/ラインコメント 「//」から行末まで
従来のコメント/ブロックコメント 「/*」から「*/」まで
ドキュメンテーションコメント(Javadocコメント) 「/**」から「*/」まで

 Javadocとは、Java APIライブラリ)の使用方法が記載されたドキュメントで、最初のうちは必ず見なければなりません。図1のような感じのものです。

図1 Java SE 6のSystemクラスのJavadoc 図1 Java SE 6のSystemクラスのJavadoc

 連載第1回「あなたの携帯電話でJavaアプリは動きますか?」でインストールしたJDK連載第2回「キャリアとプロファイルを覚えて『Hello Javaアプリ!』」でインストールしたiDKWTKにもそれぞれのJavadocが含まれているので、確認してみてください。

コラム 「コメントの名称が思っていたのと違うんだけど?」

表の各コメントの名称はJava言語仕様で規定されている(されていた)正式な名称ですが、一般的ではないような気がします。


筆者は上から「ラインコメント」「ブロックコメント」「Javadocコメント」と呼んでいます。ほかにも「1行コメント」は「C++形式コメント」、「従来のコメント」は「C言語形式コメント」という呼び方をされることもあります。


従来コメントは、この構文がC言語で採用されているため、このように呼ばれます。英語表記では、「Traditional Comment」なので、「伝統的コメント」の方がしっくりくるような気がしますが、いずれにせよJavaからプログラミングを始めた人には「従来の」でも「伝統的」でも分かりづらいですね。


「if」文はもしも……

 では、今回の本題である、制御構文の説明に入ります。

 まずは、ソースコードを見てみましょう。ソースコードは、連載第1回「あなたの携帯電話でJavaアプリは動きますか?」でデモしたテトリスみたいなゲーム「Trimis」のアプレット版のものです。まずは、「Trimisアプレット版」のソースコードをこちらよりダウンロードして、テキストエディタで開いておいてください。

 「if」文というのは「もしこれがこうならこうする、そうじゃなかったらそうする」というような条件判定を行うための制御構文です。構文は以下のようになります。

if (条件式) 文
if (条件式) 文1 else 文2
if (条件式A) 文1 else if (条件式B)文2 else 文3

 「if」が「もし」で、条件式が「これがこうなら」で、文1が「こうする」で、「else」が「そうじゃなかったら」で、文2が「そうする」に当たります。「else」以降は省略可能です。

 実際のソースコードではどうでしょうか。345行目から始まるメソッドを見てみましょう。

345 public void keyPressed(KeyEvent e) {
346
    // 落下中でかつ先行入力が2つ未満の場合のみキー入力を受け付ける
347
    if (mode == 1 && keyBuffer.length() < 2) {
348
        int keyCode = e.getKeyCode();
349
        if (keyCode == KeyEvent.VK_UP) {
350
            keyBuffer.append('U');
351
        } else if (keyCode == KeyEvent.VK_DOWN) {
352
            keyBuffer.append('D');
353
        } else if (keyCode == KeyEvent.VK_LEFT) {
354
            keyBuffer.append('L');
355
        } else if (keyCode == KeyEvent.VK_RIGHT) {
356
            keyBuffer.append('R');
357
        } else {
358
            keyBuffer.append('A');
359
        }
360
    }
361 }

 347行目の「if」文は、その直前にあるコメントのとおり「ブロックが落下中で、かつ直前のキー入力で処理されていないものが2つ未満の場合」に次の処理を行います。349行目の「if」文は「押されたキーが[上]キーなら」という条件判定を行い、そうであれば350行目で、[上]キーが押されたことを覚えておきます。

 351行目に「else if」という記述がありますが、これは「そうじゃなくて、こうなら」という意味を持ち、この場合「そうじゃなくて、押されたキーが[下]キーなら」と解釈します。

「if」文によってソースコード上の動きが変わっている様子をEclipseのデバッグ実行で表しているFlash動画(左下のボタンで再生・停止ができます)

 条件式に出てくる「==」は、右辺と左辺が同一であるかどうかを判定する演算子です。

コラム 「Javaの演算子はいっぱいある」

Javaには、たくさんの演算子が用意されています。演算子とは、その名のとおり演算を行うための命令記号で、以下の種類が用意されています。

=  >  <  !  ~  ?  :  .
==  <=  >=  !=  &&  ||  ++  --
+  -  *  /  &  |  ^  %  <<  >>  >>>
+=  -=  *=  /=  &=  |=  ^=  %=  <<=  >>=  >>>=
instanceof  (キャスト)

演算子についての詳細は、@IT:Javaプログラミング・ワンポイントレクチャー:演算子を参照ください。


 「if」文はおそらく最も多用する制御構文です。Trimisのソースコードは372行しかないのに、47個もの「if」文を使用しています。

「switch」文は場合分け

 「switch」文は「これがこの値ならこうで、この値ならこうで、どれでもなければこうする」というような条件判定を行う制御構文です。構文は以下のようになります。

switch (式) {
case 値:
    
default:
    
}

 「switch」とその直後の式が「これが」で、「case」とその直後の値が「この値なら」で、その次の文が「こうで」に当たり、「default」が「どれでもなければ」で、その後の文が「こうする」に当たります。「case」ラベルは複数記述することができ、省略することもできます。「default」ラベルは省略可能です。

 以下は構文的には正しい「switch」文ですが、何もしません。「switch (式)」の式の部分は、bytecharshortintのいずれかの返り値でなければなりません。

int foo = 1;
switch (foo) {
}

 Trimisでは、「switch」文は使用していないのですが、先ほど紹介した345行目から始まるメソッドの「if」文を「switch」文に置き換えると、以下のようになります。

 1 public void keyPressed(KeyEvent e) {
 2     // 落下中でかつ先行入力が2つ未満の場合のみキー入力を受け付ける
 3     if (mode == 1 && keyBuffer.length() < 2) {
 4         int keyCode = e.getKeyCode();
 5         switch (keyCode) {
 6         case KeyEvent.VK_UP:
 7             keyBuffer.append('U');
 8             break;
 9         case KeyEvent.VK_DOWN:
10
            keyBuffer.append('D');
11
            break;
12
        case KeyEvent.VK_LEFT:
13
            keyBuffer.append('L');
14
            break;
15
        case KeyEvent.VK_RIGHT:
16
            keyBuffer.append('R');
17
            break;
18
        default:
19
            keyBuffer.append('A');
20
        }
21
    }
22 }

 if文が結構そのままswitch文に置き換わっているのが見て取れると思います。

注意! switch文でbreakを使わないと……

 「break」というキーワードが出てきましたが、この「break」文は、そこで処理を終えることを意味しています。「break」を省略した場合は、次のラベルに処理が落ちていきます(詳細は後述します)。例を見てみましょう。

int foo = 1;
switch (foo) {
case 1:
    System.out.println("this");
case 2:
    System.out.println("is");
default:
    
System.out.println("a pen");
}

 上記のコードは、以下の出力を行います。

this
is
a pen

次ページでは、「while」文や「for」文などの処理を繰り返すための制御文について説明します。

コラム 「バグとデバッグ文」

プログラムが期待どおりに動作しない原因を「バグ」と呼びます。「バグ」とはプログラムコードに潜む“誤り”のことですが、この誤りを探すために埋め込む出力文を「デバッグ文」と呼びます。また、動作を確認するための出力文も総じて「デバッグ文」と呼びます。


Javaにおけるデバッグ文の代表格は「System.out.println(引数)」です。これはSystemクラスoutフィールドprintlnメソッドを呼び出し、標準出力に引数を出力する、Java入門者が確実に覚えなければならないメソッドです。


ただし、ケータイ本体では標準出力によるデバッグ文は確認できないので注意してください(標準出力がないためです)。ケータイでは、標準出力以外の方法でデバッグ出力を確認しますが、それはまた別の機会に紹介します。


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。