連載
» 2009年04月14日 00時00分 公開

【改訂版】Eclipseではじめるプログラミング(6):複雑なデータを表現できるクラスやフィールドって? (2/3)

[小山博史,株式会社ガリレオ]

図形をJavaのクラスに置き換えてみよう

 クラスの例をもう少し考えてみるために、図形エディタを作成するとします。図形としては、線、三角形、円を扱えるようにします。

 この図形エディタを作成するに当たって必要なクラスとしては、何があるでしょうか。図形だけに着目すると、少なくとも線や三角形、円は扱えなければいけないので、Line(線)やTriangle(三角形)、Circle(円)といったクラスが必要です。ほかに図形のためのクラスは必要ないでしょうか。よく考えると、線は点と点を結んだものですし、三角形は3つの異なる点を線で結んだものですし、円はある点からの距離が同じ点の集合になります。こういったことから、点(Point)というクラスもあった方がよさそうだということが分かります。

Javaでのクラスの表し方

 これらのクラスを実際のJavaのコードで表現するには、次のようにします。{ }の中にはクラスを表現するのに必要な情報などを後で追加します。

class クラス名 { }

Eclipseでクラスを作成するには?

 それでは、Eclipseで各クラスを作成してみましょう。手順は以下のとおりです。まずは、Pointクラスを作成してみましょう。Eclipseを起動し、パースペクティブを[Java]に切り替えておいてください。次のような手順で新規にクラスを作成することにします。

  1. [パッケージ・エクスプローラー]の[Sample]をマウス右ボタンでクリック
  2. 表示されるポップアップメニューで[新規]→[クラス]を指定
  3. 表示される[新規Javaクラス]ダイアログで、[名前]に「Point」と入力
  4. 同じ[新規Javaクラス]ダイアログで、[どのメソッド・スタブを作成しますか?]のところにある[public static void main(String[] args)]がチェックされていたら、そのチェックを外す
  5. [終了]ボタンをクリック

 作成されたPointクラスを見てみましょう。

public class Point {
}
Point.java

 「class」の前に「public」というキーワードが付いていますが、これを付けると「公開された」クラスということになり、ほかのクラスから自由に使えます。publicについての詳細は、ここでは説明しませんので、とりあえず一種の“呪文”だと思ってもらって構いません。

 このように、Eclipseではウィザード機能により、特にコーディングをしなくてもクラスを表現するのに必要なコードは自動的に生成されます。同様にして残りのLineクラスやTriangleクラス、Circleクラスも作成しましょう。

public class Line {
}
Line.java
public class Triangle {
}
Triangle.java
public class Circle {
}
Circle.java

エラーが出ていないのは当然?

 ここまでで、各クラスをJavaで表現できました。簡単すぎて、拍子抜けしたかもしれません。実は、まだクラスの基本中の基本部分を作っただけだからで、このままではクラスが持つべき情報までは表現できていません。例えば、線は2つの点で表現できますが、Lineクラスのコードからはそれが分かりません。とはいえ、まずはこの段階でエラーが出ていないことが重要です。

 読者の中には、「こんなことでエラーなんか出るはずがない」と思うかもしれませんが、日本語入力モードにしていて、たまたまスペースをコード内に入れてしまったりすると、文法エラーが発生します。そんなとき、Eclipseに付いているエディタではすぐに分かります。

Eclipseだとエラーがすぐに分かる

 Eclipseで試しにやってみると、該当部分に赤色の波線が付き、左の赤丸×にマウスを置くと「トークン"Invalid Character"に構文エラーがあります。……」といったエラーがポップアップで表示されます。

図4 Eclipseのエディタのエラー表示 図4 Eclipseのエディタのエラー表示

 エラーの意味はよく分からないでしょうが、どこに問題があるかは一目で分かります。ところが、「メモ帳」などを使っていると、これになかなか気付きません。コンパイルして初めてエラーに気が付くのですが、ファイルを開いて見ただけではどこが間違っているのか分からず、またコンパイルエラーも何をいっているのか分からないので、嫌になってしまいます。

 メモ帳を使うというのは極端な例ですが、単純なコードのうちから確認をしながら進めたり、Eclipseのような統合環境を使っていけば、ミスをしても、最後に確認した時点以降のどこかでミスをしたということにすぐに気付いたり、ツールの機能を使ったりして、問題を解決しやすくなります。プログラミングに限りませんが、こうやってチェックをしながら少しずつ確実に進めていくのが大切です。

 さて、Eclipse上で問題がないことを確認したら、次はクラスが持つべき情報を表現する方法について見てみます。

クラスが持つべき情報は「フィールド」で表す

 クラスが持つべき情報をJavaで表現するためには「フィールド(field、領域)」を使います。先に文法を理解しておきましょう。

Javaでのフィールドの表し方

 Javaでフィールドを宣言するためには、次のようにします。ただし、「データ型 フィールド名;」という文はいくつでも続けることができます。

class クラス名 {
    データ型 フィールド名;
}

 「フィールドというものを、このように定義できる」といわれても、普通は何のことだか分からないと思いますが、具体例を見るとすぐに理解できます。今回対象として考える図形は2次元のものだけとして、具体的に見てみましょう。

変数とフィールドの違い

 まずPointクラスですが、2次元の点を決めるためには、x座標とy座標の値を持つ必要があります。簡単にするため、それぞれの座標は整数値しか持たないとしましょう。すると、Pointクラスにはx座標とy座標を表現するためのフィールドが必要であり、そのフィールドにはint型のデータを保持すればよいということになります。

 データを保持するものといえば、これまでに変数というものを学びました。フィールドというのは「クラスが持つ変数」だといい換えることができます。

「点」をクラスとフィールドで表すと……

 具体的にx座標とy座標のフィールドを追加したPointクラスは次のようになります。作成してあったPointクラスを編集してください。

public class Point {
    /*
     * Pointクラスのフィールドとして、
     * x座標とy座標を持つint型変数を
     * 宣言する
     */
    int x; // x座標
    int y; // y座標
}
Point.java(フィールドあり)

コラム 「Javaのコメントには表記方法が3つある」

ここで、コメントについて説明をしておきます。Javaではプログラム中にコメントを書くために、3つの表記方法があります。1つは行単位のコメントを付けるために使う「//」です。例ではフィールドの説明に使っています。複数行のコメントを付けたいときには、「/*」と「*/」でコメントにしたい部分を囲みます。これを使って、Pointクラス内に説明文を例として入れてみました。

3つ目の方法として、「/**」と「*/」で囲むというものがありますが、これは「Javaドキュメンテーションコメント」といわれるもので、特別な意味を持つコメントです。これまでクラスをウィザードを使ってクラスを生成すると、自動で生成されるコード内に、次の記述が含まれることがありました。これはJavaドキュメンテーションコメントの例です。

/**
 * @param args
 */

「線」は2つの「点」と「点」を結ぶものですね。ということは……。ということは……

 次にLineクラスですが、これは2つの点を結ぶものなので、これらの情報を持たなければなりません。これまでデータ型としてはbooleanやint、doubleといったものしか使ってきませんでしたが、クラスもデータ型として使用できます。従って、Lineクラスは2つのPoint型のフィールドを持つように表現できるので、次のようになります。

public class Line {
    Point p0; // 始点
    Point p1; // 終点
}
Line.java(フィールドあり)

「三角形」はいくつの点を結ぶものですか?

 Triangleクラスは3つの点を持てばよいので、Lineが分かればすぐにできるでしょう。次のようになります。

public class Triangle {
    Point p0; // 頂点p0
    Point p1; // 頂点p1
    Point p2; // 頂点p2
}
Triangle.java(フィールドあり)

「円」には何が必要でしょうか?

 Circleは中心となる点p0と半径rを持つようにすればいいので、次のようになります。

public class Circle {
    Point p0; // 中心点
    int r; // 半径
}
Circle.java(フィールドあり)

 以上で、各クラスが持つべき情報をフィールドで表現できました。次ページでは実際に、これらのクラスを使ってみましょう。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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