型と変数が理解できてきたところで、次は「配列」を説明します。配列はプログラミングで最も重要な要素の1つです。
「配列」とは、同じ型の変数を連続して入れておくことができる変数です。よく分からない説明に思えるかもしれませんが、配列そのものも参照型の変数なので、とりあえず、このような説明になってしまいます。
図3はたい焼きに入れるあんこを押し出す機材を配列として表現したものです。ちなみに、たい焼きは1つずつ焼く用の鋳型で作ったものを“天然もの”、複数を一気に焼く鋳型で作ったものを“養殖もの”と呼ぶこともあるそうです。
この場合、配列の長さは10で、配列の型はあんこです。“[”と“]”で囲まれている数字は配列のインデックスで、Javaの場合インデックスは0から始まります。
図4は、出来上がったたい焼きを並べてあるだけですが、これも立派な配列です。自動販売機の中も、コーヒーやジュースの配列がたくさんあります。本棚も本の配列といえます。本だってページの配列と考えられます。行列は人の、ビルはフロアの、路線は駅の配列と考えると、世の中には配列がたくさんあることに気が付きます。
配列には、インデックスを用いてそれぞれの要素に対してアクセスすることもできますし、配列そのものにアクセスして配列の長さを参照することもできます。Javaの配列を理解するために押さえておきたいポイントを以下に並べてみます。
上記のポイントをいますぐ理解するのは難しいでしょう。配列に関する説明は、実際のソースコードと照らし合わせながら今後詳しく説明しますので、いまは理解できなくても心配しないでください。
ここでは、配列の書式だけ説明しておきます。Javaでは、配列は以下のように記述します。
型名[ ] 変数名; |
または、以下のように記述することもできます。
型名 変数名[ ]; |
配列は、“[]”(ブラケット)を使って表しますが、ブラケットを型名に付けるか変数名に付けるかはプログラマーが選択できます。どちらに付けても間違いではないですが、理由がなければ型名に付けるようにしましょう。
TrimisAppletのソースコードでは、12〜34行目でフィールドとともに配列も宣言されています。
int[][][] pattern = { |
33行目と34行目は2次元配列、15行目は3次元配列です。先ほど、多次元配列も作れる、と説明しましたが、実際のソースコードでもこのように使用されることがよくあります。「配列の配列」が2次元配列、「配列の配列の配列」が3次元配列です。
「多次元配列」は、配列を理解するうえで重要なポイントなので、次回以降時間を取って説明する予定です。
C#というJavaと似た言語では、“配列の配列”と“多次元配列”はJavaと違い明確な区別がされています。以下のコードは33行目と15行目の例をC#で書き直してみたものです。
int[][][] pattern = { |
patternは“ジャグ配列”、fieldは“多次元配列”です。配列の要素へのアクセスの仕方も異なります。以下はそれぞれ最初の要素にアクセスするための構文です。違いは明確ですね。
int i = pattern[0][0][0]; |
VB.NETという言語では、“ジャグ配列”は「多段階配列」と呼ばれています。そのほか、「配列の参照の配列」(Perl)や「ネストした配列」(Ruby)や「リストのリスト」(Python)や、やっぱり単に「配列の配列」(C言語)だったり、言語によって呼び方はさまざまです。
本連載では配列の配列も多次元配列と表現しますが、最近ではC#の登場により配列の配列と多次元配列は区別される傾向です。
「メソッド」というのは聞き慣れない言葉かもしれませんが、日本語では「方法・方式、順序・筋道」という意味合いになります。Javaでは、メソッドは実行可能なコードを意味し、しばしば「振る舞い」と呼ばれます。
メソッドというのは実行可能なコードであり、クラスに定義します。クラスにメソッドを定義しておけば、クラスから生成したインスタンスがメソッドを実行することができます。メソッドからは別のメソッドを呼び出すことができます。こうしてメソッドの呼び出しがつながって、最終的にそのつながりが1つの処理となります。
Javaプログラミングは、プログラムをモノ(オブジェクト)として考え、そのオブジェクトにはどのような特性(フィールド)や振る舞い(メソッド)があるべきかをクラスとしてまとめ上げ、メソッドに処理を記述する、ということを行います。
Javaでは、メソッドは以下のように記述します。
戻り値 メソッド名(引数) { メソッドの処理 } |
戻り値や引数については、実際にソースコードを見ながら説明します。
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() { |
このメソッドは、名前はinit、引数は持たず、戻り値はvoidです。「void」というのは、メソッドの戻り値は何もありません、ということを表すキーワードです。このメソッドの処理は1つだけで、別のメソッドを引数を1つ与えて呼び出しています。
もう1つ65行目のrun()メソッドを見てみます。
こちらは今回のクラスの中で最も長い164行の処理があるメソッドで、このゲームの中核となる処理が記述されています。いまはまだ、この長いrun()メソッドはもとより、たった1行のinitメソッドも何を行っているか分からないかもしれませんが、まだ分からなくても大丈夫です。
前回のコラム「Javaの命名規約」でJavaには命名規約があることを説明しましたが、クラス、変数、メソッドで命名規約が若干異なります。
命名個所 | 命名規約 | 例 |
---|---|---|
クラス | Pascal形式 | PascalCasing、JavaOnMobilePhone |
変数 | Camel形式 | camelCasing、javaOnMobilePhone |
メソッド | ||
「Pascal形式」というのは、先頭を大文字にし、以降の単語の先頭を大文字にする命名形式です。「Camel形式」というのは、先頭を小文字にして、以降の単語の先頭を大文字にする命名形式です。
Pascal形式もCamel形式もプログラミング言語Pascalに由来しており、どちらとも「Turbo Pascal」というPascal統合開発環境のフレームワークの命名規約としてTurbo Pascalのデザイナーたちによって考案されたものです。
Javaの命名規約は慣習で、必ずそうしなければならないというわけではありませんが、多くのJavaプログラマがこの慣習に従っています。今後、他人にソースコードを見てもらう場合も多々あると思うので、この慣習に早く慣れることをお勧めします。
このように、“たい焼き”を例としてJavaの言語使用や文法を解説してきましたが、いかがでしたでしょうか。まだまだ、理解しきれない部分も多いでしょうが、実際にプログラムを作ってみることによってだんだん理解できると思います。
次回は、メソッドの中に踏み込み、どのようにプログラミングとして処理(動き)を実装するのかを説明します。
メソッドの中でも、特にrun()メソッドの処理が理解できると、Trimisゲームがどのように動いているのかが理解でき、ゲームを遊ぶ面白さとはまた違う、ゲームを作る面白さが体感できると思います。
Copyright © ITmedia, Inc. All Rights Reserved.