プログラミング応用a 第5回『クラス定義の基礎』 |
※画像が大きすぎるときは,ブラウザの縮小を使って下さい(通常のWindows用Webブラウザの場合,コントロールキーを押しながら - キーを押すと縮小,コントロールキーを押しながら + キーを押すと拡大です)。
●今回の第5回から第10回までは,下図の流れに沿って解説していく。下図は,正しく動作するプログラムの中で「変数(インスタンス)」が送る生涯(ライフタイム)の様子である。
(画像をクリックすると今回の学習と関係するところが表示される)。
(0)まず,変数の設計図である「データ型」がある。「データ型」は「そのデータが何を表現しているか,何バイト使うか」
といった情報を持っている。たとえば,int型は「データは整数を表現していて,4バイト使う」という情報を持っている。
(1)この「データ型」を元に,メモリ上に数バイト使用して変数が誕生する。
※
なお,変数(variable)はインスタンス(instance)とも言われる。インスタンスは「実例」とか「実体」という意味で,「データ型
のひとつひとつの実例」というニュアンス である。
「住宅の一生」に例えれば,家の設計図を基に,メモリという敷地の一部をいくらか使って,その上に家を建てる 段階に当たる。
(2)変数(インスタンス)の誕生した直後は,生成される毎に中に入っている値が異なる。そのため,変数を使用する前に,適切
な初期値で変数を初期化しないとプログラムの正しい動作が期待できない。「住宅の一生」に例えれば,住宅のライフライ
ン(電気・水道・下水・ガス等々)をひいたり,家具を揃えたりカーペットや畳を敷いたりして住めるように仕上げる段階に
相当する。
(3)変数が初期化されたら,いよいよその変数を使う(変数に値を代入したり,変数に入ってる値を使ったり)段階に入る。この
とき,不正な操作で変数の値が勝手にいじられると,プログラムが正しく動作しなくなってしまう。このようなことを防ぐ
には,変数へのアクセスできるものを「正しい操作」だけに限定して,それ以外の「不正な操作・不正かもしれない操作」
からアクセスされるのを防がなくてはならない。「住宅の一生」に例えれば,住宅の中のものを勝手にいじられないように
セキュリティをかため,家族のメンバーだけが入れるようにし,家族以外の部外者の侵入を防ぐようにする,ということで
ある。
(4)変数が役目を終えるのは,その中に入っている値を最後に参照したときである。「住宅の一生」に例えれば,家の中を最後
に利用したときとなる。
(5)役目が終わり,もう使用されることがない変数は,消滅してもらわなくてはならない。なぜなら,使用されることがない変数
がそのまま居残り続けると,メモリという敷地の一部を占領しつづけることになる。このような「居残り変数」が多くなると
他の目的のために使用できるメモリ領域(空きメモリ)が不足してしまう。このように不必要な変数がメモリ上に居残り続けて,
空きメモリが不足する現象を「メモリリーク(memory leak,メモリ漏れ)」と言う。メモリリークはプログラムの動作不良
の代表的な原因である。メモリリークを防ぐために,必要の無くなった変数には消滅してもらい,その変数が占拠していた
メモリ領域を明け渡すようにする必要がある。Javaでは,不必要になった変数(いわば「ゴミ」)は,ガベージコレクション
(gabage collection,ゴミ集め)という仕組みによって自動的に調べられ,自動的に消滅するようになっている。
「住宅の一生」 に例えれば,要らなくなった住宅を壊さずにそのまま放置すると土地を無駄使いして土地不足になるので,
不必要な住宅を壊して敷地を更地に直し,土地を他の用途に使えるようにすることに当たる。
※今回は特に,
上図の「データ型」の作り方と
上図(1)の「インスタンス(オブジェクト)の生成」について解説する。
●クラス(class)とは
クラスとは,事物の概念(concept)をプログラム的に表現した物である。
クラスは,int型やdouble型のように単純なデータを表すために元から用意されているデータ型ではなく,
より複雑なものをプログラム的に表したい場合に,新しいデータ型として自作することが出来る。
クラスなどは図にしてみると分かり易い。下図は,クラスを図にしてみた例である。
※クラスの中に含まれる一個一個の変数やメソッドをメンバー(member)と呼ぶ
※クラスの中に含まれるメンバとしての変数の事を,フィールド(field)と呼ぶ(上図では薄青の正方形)
●クラスの定義方法
クラスは自分で作る事ができる。クラスの作り方を下図に示す。
※上図の最後に書いてあるように,今回以降,メソッドの定義には, static をつけないのが基本となる。
理由は後ほど。
では,プログラムで『人』を表してみよう。たとえば,下図のように『人』を表す Person1 という名前のクラスを作ると良い。
ここでは,クラス Person1 のメンバとして
・
『年齢』を表す age フィールド,
・
『性別』を表す gender フィールド,
・
『話す』という処理を表す talk( )メソッド
を用意してみよう。
List 1( ソースプログラムのダウンロード)
●クラスとオブジェクト
設計図から製品を生産できるように,クラスというデータ型(設計図)から,オブジェクトという変数(製品)を生産することが出来る(下図)。
このように,データ型を元に変数(インスタンス)を作り出すことをインスタンス化と呼ぶ。
▼FLASHによる解説(右下に「クリック」と表示されたらクリックで次に進めます)
・「クラスの定義」という設計図を元に,個々の製品としての「オブジェクト」をnew演算子で生成できる。
・同じクラスのオブジェクトを複数作ることができ,個々のオブジェクトはフィールドの値の違いによって個性を持つ。
・個々のオブジェクトのメンバは,ドット(.)を使って「オブジェクト名.メンバ名」と指定することができる。
最初から再生
※アニメーションを再生しながら,かわりばんこに友人どうしで説明し合ってみよう。
●オブジェクトの生成
では,クラスという設計図を元に,オブジェクトという製品を生産してみよう。そのために,newという演算子を使う。
しかし,そのまえに,オブジェクトは,前回習った配列のように,複数の部品から出来ていることを知ろう。
▼FLASHによる解説(右下に「クリック」と表示されたらクリックで次に進めます)
・オブジェクトは,int型やdouble型の変数とは少し扱いが違う。
・実は,クラス型変数にはオブジェクト本体が「メモリ上のどこに居るか」という情報が入っているに過ぎない。
・クラス型変数はオブジェクトそのものではなく,オブジェクト本体への橋渡し役に過ぎない。
最初から再生
※アニメーションを再生しながら,かわりばんこに友人どうしで説明し合ってみよう。
上のFLASHアニメーションで説明されているように,オブジェクトは
・オブジェクト本体の場所情報(参照値)(を格納したクラス型変数)
・オブジェクト本体
の2個の部品の組み合わせからなっている(下図Fig.5(b))。
・実際にオブジェクト本体を生成するには,new演算子を使って下図の様に書けば良い。
【参考情報】:上記の(3)で紹介されている書式中の=で行われる処理((3)-②)は,正確には「代入」ではなく,「初期化」である。ここでは初心者用の説明として,同じものとして扱っている。
List 2 ( ソースプログラムのダウンロード)
▼FLASHによる解説(右下に「クリック」と表示されたらクリックで次に進めます)
最初から再生
※アニメーションを再生しながら,かわりばんこに友人どうしで説明し合ってみよう。
参考)List 2を単独のウィンドウで表示する
参考)List 2からコメントなどの余計な物を省いたシンプル版を単独のウィンドウで表示する
●オブジェクトのメンバの利用法
・今までのアニメーション教材で見たように,オブジェクト本体に内蔵されたメンバを利用するには下図(1)のように指定する。
・今までのアニメーション教材で見たように,(staticの付いていない)メソッドの中で,メンバの名前を書くと,それは自オブジェクトのメンバ名のことであった。
例えば,すぐ上の解説アニメーションでは, talk( )メソッドの中で age と書けば,それは自オブジェクトの age フィールドのことであった。
実は,自オブジェクトを表す this という特別なオブジェクト名を使って,明示的に自オブジェクトのメンバ名である事を示すことも出来る(下図(2))。
●ある意味,Javaなどで書かれたオブジェクト指向プログラムは,
(1)オブジェクトを生成する
(2)オブジェクトの機能(メソッド)を使う
ということと言えなくもない。
※次のリストWindowOpener.javaは,ウィンドウを表すJFrameクラスのオブジェクトを生成して,その機能を使っている。
※このJFrameクラスのようにJavaには便利なクラスがたくさん用意されていて,それらをまとめてクラスライブラリと呼ぶ。
※面白いプログラムを作るには,Javaのクラスライブラリを見て,使えそうなクラスを探すと良い。
import javax.swing.*; // JFrameクラスを使うために必要 public class WindowOpener { public static void main( String[] args ) { JFrame fr = new JFrame(); // ウィンドウを表すJFrame型のオブジェクトfrを生成 fr.setSize( 200, 150 ); // JFrame型オブジェクトのメソッド setSize()でウィンドウのサイズを設定 fr.setVisible( true ); // JFrame型オブジェクトのメソッド setVisible()でウィンドウを見えるようにする fr.setLocation( 100, 200 );// JFrame型オブジェクトのメソッド setLocation()でウィンドウの位置を設定 } } |
では,オリジナルのクラスを定義し,そのオブジェクトを生成するシンプルな例をさらに紹介しよう。
【例題1】
この例題プログラムを作成する過程を下図のアニメーションで解説する。
▼FLASHによる解説(右下に「クリック」と表示されたらクリックで次に進めます)
最初から再生