複雑なデータを表現できるクラスやフィールドって?:【改訂版】Eclipseではじめるプログラミング(6)(3/3 ページ)
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります
使えば分かる! クラスとフィールド
最初にこれらのオブジェクトを使用するSample60クラスを作成します。手順は以下のとおりです。
- [パッケージ・エクスプローラー]の[Sample]をマウス右ボタンでクリック
- 表示されるポップアップメニューで[新規]→[クラス]を指定
- 表示される[新規Javaクラス]ダイアログで、[名前]に「Sample60」と入力
- 同じ[新規Javaクラス]ダイアログで、[どのメソッド・スタブを作成しますか?]のところにある[public static void main(String[] args)]をチェック
- [終了]ボタンをクリック
それでは、Sample60で、原点(0, 0)を表す点o(オー)オブジェクト、点(1, 2)と点(3, 6)を結ぶ線lineオブジェクトと、点(2, 3)と点(4, 9)と点(0, 6)から構成される三角形triangleオブジェクトと、点(10, 10)を中心として半径が1である円circleオブジェクトを表現してみましょう。
まずは、変数の宣言
これらのオブジェクトを表現するためには、これまでに用意したクラスを使って変数を宣言します。
// 点oオブジェクト Point o; // 線lineオブジェクト Line line; // 三角形triangleオブジェクト Triangle triangle; // 円circleオブジェクト Circle circle;
「new演算子」で「インスタンス」を作ろう
Javaでは、変数を宣言しただけではオブジェクトの情報を保持するための入れ物は用意されません。配列のときと同じように「new演算子」を使って、この入れ物を作成します。こうやって作成された入れ物のことを、「インスタンス(instance、事実、実例)」といいます。インスタンスは、プログラムにおいてオブジェクトの情報を格納するために作成されるものと覚えておいてください。
インスタンスを作成するためには、new演算子の後に「クラス名()」と書きます。また、インスタンスが作成された後の評価結果は、インスタンスが用意された場所を示す値となります。この値を変数へ代入することにより、変数を使って入れ物を利用できるようになります。
o = new Point(); line = new Line(); triangle = new Triangle(); circle = new Circle();
コラム 「new演算子の後に来る『コンストラクタとは?」
インスタンスを作成するためにnew演算子の後に書いたものは、実は各クラスの「コンストラクタ(construtor、組立てる者)」というものです。
入れ物を作成するに当たっては、各フィールドの初期値を設定したいことも多いので、そういった処理ができるようにコンストラクタというものが用意されており、プログラマが自分でその処理をコーディングすることもできるようになっています。
本連載では、コンストラクタの詳細については解説しませんが、興味のある読者は調べてみてください。
フィールドへ値を設定するには?
さて、入れ物の作成ができて、変数を使って利用できるようになりました。ただし、まだ原点の情報や点(1, 2)の情報などはプログラムに入ってきていないので、これらの値を設定しなければいけません。フィールドへ値を設定するためには、次のようにします。もちろん変数名の後に指定できるフィールド名は変数の型となるクラスが持つフィールド名だけです。
変数名.フィールド名 = 値;
従って、変数oへ次のように値を設定することで、oは原点を表現することになります。
o.x = 0; o.y = 0;
インスタンスはフィールドに直接代入できる
次に、lineやtriangleのフィールドを設定しますが、注意しなければならないことがあります。lineやtriangleではPoint型のフィールドは宣言されていますが、これらの入れ物が用意されていないということです。そこで、これらの変数のフィールドへ設定するPoint型のインスタンスを使うために変数を用意します。
Point point = new Point(); point.x = 2; point.y = 3; line.p0 = point; point = new Point(); point.x = 4; point.y = 9; line.p1 = point;
フィールドへ直接Point型のインスタンスを代入してからx座標とy座標を代入することもできます。
triangle.p0 = new Point(); triangle.p0.x = 3; triangle.p0.y = 9; triangle.p1 = new Point(); triangle.p1.x = 4; triangle.p1.y = 3; triangle.p2 = new Point(); triangle.p2.x = 4; triangle.p2.y = 6;
同様にしてcircleにも値を設定します。
circle.p0 = new Point(); circle.p0.x = 10; circle.p0.y = 10; circle.r = 1;
最後に例としてo.x、line.p0.y、line.p1.x、triangle.p2.y、circle.rの値を出力してみます。もしo.yやline.p0.xなどほかの値を出力してみたい場合は、同様にして System.out.printlnの命令を使って出力してみてください。
System.out.println(o.x); System.out.println(line.p0.y); System.out.println(line.p1.x); System.out.println(triangle.p2.y); System.out.println(circle.r);
各オブジェクトをプログラムで表現できた!
ここまでのコードをまとめると、次のようになります。これで各オブジェクトをプログラムで表現できたことになります。
public class Sample60 { public static void main(String[] args) { // 点oオブジェクト Point o; // 線lineオブジェクト Line line; // 三角形triangleオブジェクト Triangle triangle; // 円circleオブジェクト Circle circle; // インスタンス生成と各変数への代入 o = new Point(); line = new Line(); triangle = new Triangle(); circle = new Circle(); // 点oの初期化 o.x = 0; o.y = 0; // 線lineの初期化 Point point = new Point(); point.x = 2; point.y = 3; line.p0 = point; point = new Point(); point.x = 4; point.y = 9; line.p1 = point; // 三角形triangleの初期化 triangle.p0 = new Point(); triangle.p0.x = 3; triangle.p0.y = 9; triangle.p1 = new Point(); triangle.p1.x = 4; triangle.p1.y = 3; triangle.p2 = new Point(); triangle.p2.x = 4; triangle.p2.y = 6; // 円circleの初期化 circle.p0 = new Point(); circle.p0.x = 10; circle.p0.y = 10; circle.r = 1; // 各オブジェクトの値を出力 System.out.println(o.x); System.out.println(line.p0.y); System.out.println(line.p1.x); System.out.println(triangle.p2.y); System.out.println(circle.r); } }
このプログラムを実行すると、o.x、line.p0.y、line.p1.x、triangle.p2.y、circle.rの値が出力されて以下のような結果が得られます。
Sample60.javaの実行結果
0 3 4 6 1
オブジェクト指向は直感的で便利!
今回は、オブジェクトとクラスという用語、Javaのクラスとインスタンスについて解説をしました。また、クラスの属性を表現するためには、Javaではクラスにフィールドを用意するということを解説しました。
オブジェクト指向では、実際にある物からクラスを抽出すればよいので、直感的にプログラムを理解できたのではないでしょうか。今回の例だけでは、まだピンと来ないかもしれませんが、クラスを使うことにより、まとめて扱いたいデータ用に自分でデータ型を定義できるようになります。対象とするデータを保持するためには、対応するフィールドをクラスに用意するだけです。
このクラスやフィールドというものは重要な概念になりますので、よく覚えておくようにしてください。また、Javaではインスタンスを生成するためには、基本的にnew演算子を使う点も忘れないようにしましょう。
さて、クラスの宣言については、まだ重要な要素が抜けています。それは「クラスの振る舞い」についてです。Javaでは「メソッド」というものを使って、「クラスの振る舞い」を表現します。まとめて扱いたいデータに対してデータ型を定義できるだけでもクラスというのは便利ですが、メソッドという概念を理解すると、さらに便利になります。次回はこれらについて解説する予定です。
今回作ったサンプルのソースコードはこちらからダウンロードできます。
筆者紹介
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。
著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。
- Javaの例外処理で知らないと損する7つのテクニック
- プログラマの宿命! 例外とエラー処理を理解する
- いまさら聞けない「Javadoc」と「アノテーション」入門
- 7ステップで理解するJavaでの列挙型/enum使用法
- 拡張for文の真の実力を知り、反復処理を使いこなせ
- キュー構造をJavaで実装してジェネリック型を理解する
- 強く型付けされているJavaの理解に必修の“型変換”
- あなたの知らない、4つのマニアックなJava文法
- “ネスト”した型で始める軽量Javaプログラミング!?
- Javaは「抽象クラス」で実装を上手に再利用できる
- 再利用性の高いクラス作成に重要な“アクセス制御”
- “コンストラクタ”と初期化、本当に理解できてる?
- 継承やオーバーライドで簡単にクラスを“拡張”しよう
- 「static」でクラス共有の変数・メソッドを使いこなせ!
- Javaの実案件に必須のパッケージとインポートを知る
- プログラムを「変更」しやすくする“インターフェイス”
- Javaの参照型を文字列操作で理解して文法を総復習
- クラスの振る舞いを表すJavaの“メソッド”とは?
- 複雑なデータを表現できるクラスやフィールドって?
- データ集合を扱うのに便利なJavaの配列と拡張for文
- プログラミングの真骨頂! Javaで“反復処理”を覚える
- プログラミングの醍醐味! Javaで“条件式”を理解する
- Javaで一から理解するプログラムの変数と演算子
- Eclipse 3.4で超簡単Javaプログラミング基礎入門
Copyright © ITmedia, Inc. All Rights Reserved.