Section 2.1 クラスって?

今回から第2章、クラスについて。
今までにも Date クラスとか System クラスは使ってきたけど、 そもそもクラスってどういうものなの?
クラスっていうのは、属性操作が定義されてるオブジェクトの設計図、っていう感じかな。
オブジェクトの設計図…?
うん。
例えば、今時計を作ろうとしてるよね。
うん、それが最初に立てた目標だよね。
時計も一つのクラスと見なせるんだ。
あ、そうなの?
うん。時計の場合は、こんなふうに属性と操作を定義すると、時計クラスが作れるよ。

<時計クラス>

属性操作
現在時刻現在時刻を表示する
アラームを鳴らす時刻アラームをセットする
アラームの音アラームを鳴らす

属性が時計の状態で、操作が時計の状態に従って何かをやったり、時計の状態を変えたりする方法だね。
う〜ん、解ったような解んないような…。
まぁ、そんなにクラスの定義にこだわらなくっても、時計を作ろうと思った時に何が必要かってことを考えれば、自然と属性や操作が定義できると思うよ。
そなの?
うん。
まず、時計って言うからには今の時間を表示できなくちゃいけないでしょ?
そりゃそうだよね。
今の時間を表示するためには、現在時刻がわかってないといけないよね。
うん、もちろん。
これで属性と操作が1つずつ定義できたでしょ。
あ、ほんとだ。
現在時刻」っていう属性と「現在時刻を表示する」っていう操作が定義できたね。
あと、今回作る時計にはアラームを鳴らす機能もつけるから、アラームをセットする機能とアラームを鳴らす機能も必要だよね。
それって「アラームをセットする」っていう操作と「アラームを鳴らす」っていう操作が定義できるってこと?
そうそう。
あと、いつアラームを鳴らすのかってことと、どんな音のアラームを鳴らすのかってことが判ってないと、アラームを鳴らせないよね。
これで「アラームを鳴らす時刻」と「アラームの音」の属性が定義できたってこと?
ん、そういうこと。
だからそんなに難しく考えなくても大丈夫。
ん〜、何となく解ったかな。
ま、要は作りたいものには何が必要かってのを考えれば、設計図が作れるからクラスも定義できるってこと。
なるほどね。
で、設計図を作っただけじゃ実際に時計として使えないから、設計図をもとにして実際の時計を作る必要があるわけだけど、 これをインスタンス化っていうんだ。
インスタンス化?
Date クラスのメソッドを使う時には、まず…

<インスタンス化>

var d = new Date();  // Date クラスのオブジェクトを作成します

っていうスクリプトを書いたでしょ。
うん、書いたね。
これがインスタンス化。
Date クラスってのは日付や時刻を管理するシステムの設計図なわけだから、 メソッドを使って今の時刻を取得しようと思ったら、設計図を見てシステムの実体を作らなくちゃいけないんだ。
ふ〜ん…そうなんだ。
で、クラスっていう設計図を見てオブジェクト、つまり実際のシステムを作るのが new 演算子ってワケ。
new ってそういう意味だったんだ。
あ、でも System クラスはインスタンス化しなくてもメソッドが使えるよね?
§1.2 でもちょっと説明したけど、元々用意されてるクラスの中には、インスタンス化しなくてもいい特殊なクラスが何個かあるんだ。 System クラスはその中の一つ。
…まぁ、正確には「インスタンス化しなくていい」じゃなくて「インスタンス化できない」なんだけどね。
確かにそれって前にも聞いたよね。
でも何でインスタンス化できなくなってるの?
ん〜、その辺は詳しくはわからないんだけど、多分インスタンスを作る必要がないからじゃないかな。
それってどういうこと?
例えば時計の場合だと、ある時計は12時にアラームを鳴らす設定になってても、別の時計は15時に鳴らす設定になってるかもしれないでしょ。
うん、まぁそうだね。
つまり、オブジェクト毎に状態が違ってる可能性があるってこと。
うんうん。
でも、System クラスの場合は、inform メソッドも inputString メソッドもシステムの状態は全然変えないよね。
そう言えば、inform メソッドはメッセージを表示するだけだし、 inputString は入力された内容を返すだけだから、状態は変わらないね。
つまり、オブジェクト毎に別々な状態になるってことがないから、オブジェクトを複数作っても意味が無いんじゃないかな。
あと、System クラスみたいにシステムを管理してるクラスは、複数オブジェクトを作ると競合しちゃうかもしれないしね。
だからインスタンス化できなくなってるってこと?
だと思うよ。
それじゃ、最後にクラスの構成要素を簡単に紹介しとくね。
クラスにはこんな要素があるんだ。

<クラスの構成要素>

コンストラクタ
オブジェクトが作られる時に実行される関数
finalize メソッド(デストラクタ)
オブジェクトが消滅する時に実行される関数
メンバ変数
クラスの中で宣言されている変数(属性に対応する要素)
メンバ関数(メソッド)
クラスの中で定義されている関数(操作に対応する要素)
メンバプロパティ
メンバ変数の値を適切に参照・設定するための関数(変数のように扱うことが可能)

メソッドとかプロパティは今までにも使ったことあるけど、コンストラクタとか見たことないのもあるね。
うん。
それぞれの要素はこれから説明していくから。
うん、わかった。
じゃ、今回はここまでね。
次回から実際にクラスを作っていくよ。
はーい。
それじゃ、また次回ね。


前へ | TOP | 次へ