さらなる高みへ -higher ground -

プログラミング学習の定着を狙いとしたアウトプット(独り言)をしてみるブログ

Rubyの基本概念④-クラスとインスタンス-

クラスとインスタンスを理解するうえで、前提知識としてオブジェクトについての理解が不可欠である。
https://roadtoengineer.hatenablog.com/entry/2020/01/01/120603

上記記事のように、Rubyはオブジェクトを中心に考える言語なので、オブジェクトの管理・生成の仕方が重要になる。
そのために必要な概念が、クラスとインスタンスという位置づけである。

クラスとインスタンス

クラスとは

クラスとは、とある種類のオブジェクトの共通の属性とメソッドをまとめて定義しておく型のようなものである。

例えば、"Hello World"という文字列と"こんにちは"という文字列は、それぞれが一つの異なるオブジェクトである。
しかし、この二つのオブジェクトの間には「文字を持つ」という共通点が存在する。

この性質は、実は予めクラスの性質として定義されているものである。
同時に、この文字列のクラスの中には、共通で使えるメソッド(例えば、文字列オブジェクトはlengthメソッドが使用できる)を定義できる。

そして、このクラスに基いて文字列を作れば、文字列の中に入れる文字さえ決めれば、新たな文字列を生成できる。

[例]文字列クラス
1
2
3
  string1 = "Hello World"
  string2 = "こんにちは"
 #どちらも「文字を持つ」という点では共通

オブジェクトを中心にプログラムを作る場合、多数のオブジェクトを生成することになる。
オブジェクト一つ一つを0から生成するとなると、相当な手間が発生する。

例えば先ほどの例で、文字列を一つ作る度に「これから生成するオブジェクトは、文字を持つことができる」というところから定義していたら大変でな作業量となる。
オブジェクト同士には共通する部分が存在することがほとんどである。
共通する性質をクラスという型で定義しておくことで、効率的に個々のオブジェクトを生成することができる。

このRuby的な考え方を現実世界に置き換えると、人間一人一人、車一台一台が別々のオブジェクトになる。
しかし、人間というくくりで考えるならば、別々のオブジェクトでも共通している性質を見つけることができる。
例えば、人間ならば「名前を持っている」「年齢を持っている」という点は必ず共通している。車も同様である。

そこでまず、以下の図のように共通の部分をクラスとして定義する。

人クラスであれば、以下のように、属性とメソッドが定義されることになる。

https://tech-master.s3.amazonaws.com/uploads/curriculums//c286be0fdd462a7b50e6849e1da09d04.png

そして、このような型を予め定義しておけば、この型に沿って、個別のオブジェクトを作ることができる。
そうすることで、効率的に個別のオブジェクトを生産することが可能となる。

インスタンスとは

ブジェクトを作るときはいきなりオブジェクトを生産するのではなく、オブジェクト同士で共通しそうな部分をクラスという型で定義する。
そして、クラスに基いて生み出されたオブジェクトのことをインスタンスと呼ぶ

実際にプログラムを書くときには、オブジェクトがあらかじめ存在するということはありえない。
なので、以下の図のように、クラスを作ってからそれに基いてインスタンスを作るという順番でオブジェクトを作ることになる。

もし、人間の共通の情報を定義した人クラスが存在した場合、人クラスのインスタンスは以下のようになる。

このように、クラスには「名前」「性別」などの属性が定義されている。
そして、クラスで定義した属性に具体的な値が入った状態でインスタンスが生成される。

属性と属性値

属性とは、オブジェクトが持つ情報の種類のことである。
上記の「人クラス」の例だと、「名前」とか「性別」が属性にあたる。
クラスには、オブジェクトの持つ属性を定義する。

属性値とは、クラスで定義した属性に入る、オブジェクトが実際に持つ情報のことである。
上記の例では、「花子」とか「男」とかが属性値にあたる。
インスタンスでは、クラスで定義した属性に、具体的な情報を入れてそれを属性値として持つ。