連載
» 2008年03月12日 00時00分 公開

“たい焼き”であま〜く理解するJava文法と言語仕様携帯アプリを作って学ぶJava文法の基礎(3)(2/2 ページ)

[緒方聡,エスマテック株式会社]
前のページへ 1|2       

“養殖もの”から「配列」のポイントを押さえる

 型と変数が理解できてきたところで、次は「配列」を説明します。配列はプログラミングで最も重要な要素の1つです。

 「配列」とは、同じ型の変数を連続して入れておくことができる変数です。よく分からない説明に思えるかもしれませんが、配列そのものも参照型の変数なので、とりあえず、このような説明になってしまいます。

図3 配列の概念(1) 図3 配列の概念(1)

 図3はたい焼きに入れるあんこを押し出す機材を配列として表現したものです。ちなみに、たい焼きは1つずつ焼く用の鋳型で作ったものを“天然もの”、複数を一気に焼く鋳型で作ったものを“養殖もの”と呼ぶこともあるそうです。

 この場合、配列の長さは10で、配列の型はあんこです。“[”と“]”で囲まれている数字は配列のインデックスで、Javaの場合インデックスは0から始まります。

図4 配列の概念(2) 図4 配列の概念(2)

 図4は、出来上がったたい焼きを並べてあるだけですが、これも立派な配列です。自動販売機の中も、コーヒーやジュースの配列がたくさんあります。本棚も本の配列といえます。本だってページの配列と考えられます。行列は人の、ビルはフロアの、路線は駅の配列と考えると、世の中には配列がたくさんあることに気が付きます。

 配列には、インデックスを用いてそれぞれの要素に対してアクセスすることもできますし、配列そのものにアクセスして配列の長さを参照することもできます。Javaの配列を理解するために押さえておきたいポイントを以下に並べてみます。

  • 配列のインデックスは0から始まる
  • 配列の長さは配列自体から取得できる
  • 「配列の配列」のような多次元配列を作成できる
  • 配列の操作は、制御文と組み合わせることが多い

 上記のポイントをいますぐ理解するのは難しいでしょう。配列に関する説明は、実際のソースコードと照らし合わせながら今後詳しく説明しますので、いまは理解できなくても心配しないでください。

配列の宣言の仕方

 ここでは、配列の書式だけ説明しておきます。Javaでは、配列は以下のように記述します。

型名[ ] 変数名;

 または、以下のように記述することもできます。

型名 変数名[ ];

コラム 「配列のブラケットはどこに付けるべき?」

配列は、“[]”(ブラケット)を使って表しますが、ブラケットを型名に付けるか変数名に付けるかはプログラマーが選択できます。どちらに付けても間違いではないですが、理由がなければ型名に付けるようにしましょう。


配列の宣言をソースコードで見る

 TrimisAppletのソースコードでは、12〜34行目でフィールドとともに配列も宣言されています。

int[][][] pattern = {
    {
        {0, 1, 0},
        {0, 1, 0},
        {0, 1, 0}
    }, {
        {0, 1, 0},
        {0, 1, 1},
        {0, 0, 0}
    }
};

(略)

int[][] field = new int[FIELD_HEIGHT][FIELD_WIDTH];

 33行目と34行目は2次元配列、15行目は3次元配列です。先ほど、多次元配列も作れる、と説明しましたが、実際のソースコードでもこのように使用されることがよくあります。「配列の配列」が2次元配列、「配列の配列の配列」が3次元配列です。

 「多次元配列」は、配列を理解するうえで重要なポイントなので、次回以降時間を取って説明する予定です。

コラム 「“配列の配列”と“多次元配列”は違う?」

C#というJavaと似た言語では、“配列の配列”と“多次元配列”はJavaと違い明確な区別がされています。以下のコードは33行目と15行目の例をC#で書き直してみたものです。


int[][][] pattern = {
    new int[][] {
        new int[] {0, 1, 0},
        new int[] {0, 1, 0},
        new int[] {0, 1, 0}
    }, new int[][] {
        new int[] {0, 1, 0},
        new int[] {0, 1, 1},
        
new int[] {0, 0, 0}
    }
};

……(略)……

int[,] field = new int[FIELD_HEIGHT, FIELD_WIDTH];


patternは“ジャグ配列”、fieldは“多次元配列”です。配列の要素へのアクセスの仕方も異なります。以下はそれぞれ最初の要素にアクセスするための構文です。違いは明確ですね。


int i = pattern[0][0][0];
int j = field[0, 0];


VB.NETという言語では、“ジャグ配列”は「多段階配列」と呼ばれています。そのほか、「配列の参照の配列」(Perl)や「ネストした配列」(Ruby)や「リストのリスト」(Python)や、やっぱり単に「配列の配列」(C言語)だったり、言語によって呼び方はさまざまです。


本連載では配列の配列も多次元配列と表現しますが、最近ではC#の登場により配列の配列と多次元配列は区別される傾向です。


食べられる”か“海に逃げ込む”かで「メソッド」を知る

 「メソッド」というのは聞き慣れない言葉かもしれませんが、日本語では「方法・方式、順序・筋道」という意味合いになります。Javaでは、メソッドは実行可能なコードを意味し、しばしば「振る舞い」と呼ばれます。

図5 たい焼きの「メソッド」 図5 たい焼きの「メソッド」

 メソッドというのは実行可能なコードであり、クラスに定義します。クラスにメソッドを定義しておけば、クラスから生成したインスタンスがメソッドを実行することができます。メソッドからは別のメソッドを呼び出すことができます。こうしてメソッドの呼び出しがつながって、最終的にそのつながりが1つの処理となります。

 Javaプログラミングは、プログラムをモノ(オブジェクト)として考え、そのオブジェクトにはどのような特性(フィールド)や振る舞い(メソッド)があるべきかをクラスとしてまとめ上げ、メソッドに処理を記述する、ということを行います。

メソッドの宣言の仕方

 Javaでは、メソッドは以下のように記述します。

戻り値 メソッド名(引数) {
    メソッドの処理
}

 戻り値引数については、実際にソースコードを見ながら説明します。

メソッド宣言をソースコードで見るをソースコードで見る

 TrimisAppletには、以下のメソッドが宣言されています。

表3 TrimisAppletのメソッド一覧
行番号 メソッドのシグネチャ
36 init()
40 start()
51 stop()
61 destory()
65 run()
232 copy(int[][], int[][])
238 rotate(int[][])
254 isHit(int, int, int[][])
267 initField()
288 drawBlocks(Graphics)
309 drawNext(Graphics)
325 drawScore(Graphics)
337 sleep(long)
345 keyPressed(KeyEvent)
363 keyReleased(KeyEvent)
367 keyTyped(KeyEvent)

 「シグネチャ」というのは、メソッド名と引数の型と個数を表したメソッドを特定するための情報です。いまは「そんなものがあるな」という程度に理解しておいてください。

 それでは、36行目のinitメソッドを見てみましょう。

public void init() {
    addKeyListener(this);
}

 このメソッドは、名前はinit、引数は持たず、戻り値はvoidです。「void」というのは、メソッドの戻り値は何もありません、ということを表すキーワードです。このメソッドの処理は1つだけで、別のメソッドを引数を1つ与えて呼び出しています。

 もう1つ65行目のrun()メソッドを見てみます。

 こちらは今回のクラスの中で最も長い164行の処理があるメソッドで、このゲームの中核となる処理が記述されています。いまはまだ、この長いrun()メソッドはもとより、たった1行のinitメソッドも何を行っているか分からないかもしれませんが、まだ分からなくても大丈夫です。

コラム 「Javaの命名規約の基になったプログラミング言語とは?」

前回のコラム「Javaの命名規約」でJavaには命名規約があることを説明しましたが、クラス、変数、メソッドで命名規約が若干異なります。


表2 命名個所と命名形式
命名個所 命名規約
クラス Pascal形式 PascalCasing、JavaOnMobilePhone
変数 Camel形式 camelCasing、javaOnMobilePhone
メソッド

「Pascal形式」というのは、先頭を大文字にし、以降の単語の先頭を大文字にする命名形式です。「Camel形式」というのは、先頭を小文字にして、以降の単語の先頭を大文字にする命名形式です。


Pascal形式もCamel形式もプログラミング言語Pascalに由来しており、どちらとも「Turbo Pascal」というPascal統合開発環境フレームワークの命名規約としてTurbo Pascalのデザイナーたちによって考案されたものです。


Javaの命名規約は慣習で、必ずそうしなければならないというわけではありませんが、多くのJavaプログラマがこの慣習に従っています。今後、他人にソースコードを見てもらう場合も多々あると思うので、この慣習に早く慣れることをお勧めします。


“遊ぶ”だけではなく“作る”面白さも体感しよう

 このように、“たい焼き”を例としてJavaの言語使用や文法を解説してきましたが、いかがでしたでしょうか。まだまだ、理解しきれない部分も多いでしょうが、実際にプログラムを作ってみることによってだんだん理解できると思います。

 次回は、メソッドの中に踏み込み、どのようにプログラミングとして処理(動き)を実装するのかを説明します。

 メソッドの中でも、特にrun()メソッドの処理が理解できると、Trimisゲームがどのように動いているのかが理解でき、ゲームを遊ぶ面白さとはまた違う、ゲームを作る面白さが体感できると思います。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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