クラスとインスタンス
クラスについて
クラスとは、とある種類のオブジェクトの共通の属性とメソッドをまとめて定義しておく型のようなもの。
例えば、"Hello World"という文字列と"こんにちは"という文字列は、それぞれが一つの異なるオブジェクト。しかし、この二つのオブジェクトの間には「文字を持つ」という共通点が存在する。この性質は、実は予めクラスの性質として定義されているもの。
同時に、この文字列のクラスの中には、共通で使えるメソッド(例えば、文字列オブジェクトはlengthメソッドが使用できる)を定義できる。そして、このクラスに基いて文字列を作れば、文字列の中に入れる文字さえ決めれば、新たな文字列を生成できる。
1 2 3 |
string1 = "Hello World"
string2 = "こんにちは"
#どちらも「文字を持つ」という点では共通
|
オブジェクトを中心にプログラムを作る場合、多数のオブジェクトを生成することになる。オブジェクト一つ一つを0から生成するとなると、相当な手間が発生する。例えば先ほどの例で、文字列を一つ作る度に「これから生成するオブジェクトは、文字を持つことができる」というところから定義していたら大変。
オブジェクト同士には共通する部分が存在することがほとんど。共通する性質をクラスという型で定義しておくことで、効率的に個々のオブジェクトを生成することができる。
以下のような例で考えてみる。
一つ前の項で説明したように、Ruby的な考え方で現実世界を捉えた場合、人間一人一人、車一台一台が別々のオブジェクトになる。
しかし、人間というくくりで考えるならば、別々のオブジェクトでも共通している性質を見つけることができる。例えば、人間ならば「名前を持っている」「年齢を持っている」という点は必ず共通している。車も同様です。そこでまず、以下の図のように共通の部分をクラスとして定義する。
人クラスであれば、以下のように、属性とメソッドが定義されることになる。
そして、このような型を予め定義しておけば、この型に沿って、個別のオブジェクトを作ることができる。
そうすることで、効率的に個別のオブジェクトを生産することができる。
インスタンスについて
オブジェクトを作るときはいきなりオブジェクトを生産するのではなく、オブジェクト同士で共通しそうな部分をクラスという型で定義する。
そして、クラスに基いて生み出されたオブジェクトのことをインスタンスと呼ぶ。
クラスが先。クラスからインスタンスが生まれる
実際にプログラムを書くときには、オブジェクトがあらかじめ存在するということはありえない。なので、以下の図のように、クラスを作ってからそれに基いてインスタンスを作るという順番でオブジェクトを作ることになる。
もし、人間の共通の情報を定義した人クラスが存在した場合、人クラスのインスタンスは以下のようになる。
このように、クラスには「名前」「性別」などの属性が定義されている。そして、クラスで定義した属性に具体的な値が入った状態でインスタンスが生成される。
属性と属性値
属性とは、オブジェクトが持つ情報の種類のこと。上記の「人クラス」の例だと、「名前」とか「性別」が属性にあたる。クラスには、オブジェクトの持つ属性を定義する。
属性値とは、クラスで定義した属性に入る、オブジェクトが実際に持つ情報のこと。上記の例では、「花子」とか「男」とかが属性値にあたる。インスタンスでは、クラスで定義した属性に、具体的な情報を入れてそれを属性値として持つ。
クラスとインスタンスについてのまとめ
・Rubyでは、すべてのデータがオブジェクトとして扱われ、オブジェクトごとに性質や使えるメソッドを持つ
・オブジェクトを効率的に生成・管理するために、クラスとインスタンスという概念が存在する
・オブジェクト同士の共通の属性・メソッドをまとめて定義したものがクラスである
・クラスに基いて生成されたオブジェクトがインスタンス
・実際にプログラムを書くときでは、必ずクラスを定義して、そのクラスに基いてインスタンスを生成するという順番でオブジェクトを生成する。