※2022年から技術系の記事は個人ブログに投稿しております。ぜひこちらもご覧ください→yamaday0u Blog
今回はRubyにおけるクラスとインスタンスの違いを整理します。
結論:クラスは設計図・仕様、インスタンスは個別のデータ
クラスは設計図・仕様、インスタンスはクラスを元に生成される個別具体的なデータです。
逆に言えば、クラスは個別具体的なデータを生成するための設計図・仕様とも言えますね。
クラスとは
クラスは、個別のデータ(値)の生成するための設計図・使用を指します。
この設計図・仕様では共通の属性と処理(メソッド)を定義します。
オブジェクト指向では、互いに関連するデータと、データを操作するメソッドを一つのオブジェクトと呼ばれる単位に一体化(カプセル化)して取り扱う。あるオブジェクトがどのようなデータとメソッドから作られるのかを定義した、言わば雛形にあたるものをクラスという。(IT用語辞典 e-Wordsより)
たとえば「人クラス」という、人を作るための設計図を作るとします。
人には以下のような属性が与えられます。
- 名前
- 性別
- 年齢
- 身長
- 体重
これらをプロパティと言います。
また、人は以下のような動作をすることができます。
- 歩く
- ジャンプする
- 投げる
- しゃべる
これらの動作(処理)を定義したものをメソッドと言います。
これらの属性や動作は人に関する共通の情報としてまとめたものをクラスと言います。
クラスで共通の情報をまとめ、個別の情報は各データごとに分けることで、アプリケーションサービスの開発・管理・保守がし易くなるという利点があります。
上記のとおり、クラスは共通の属性と処理を決めるだけで、個別のデータがありません。
つまり、具体的な人という姿を持っていません。
そこでインスタンスが登場します。
インスタンスとは
インスタンスとは、クラスを元にして作られる個別具体的なデータのことです。
オブジェクト指向プログラミングで、クラス定義に基いてメモリ上にデータと手続きの集合として実体化されたオブジェクトのことをインスタンスという。クラスからインスタンスを生成することを「インスタンス化」(instantiation)という。(IT用語辞典 e-Wordsより)
インスタンスは、クラスと異なり実体を持ちます。
先ほどの「人クラス」の例で、ぼく(yamaday0u)を作るとすると以下のようになります。
- 名前:yamaday0u
- 性別:男
- 年齢:27才
- 身長:165cm
- 体重:58kg
これらは属性という、ぼくの基本情報で、必要に応じて「歩く」「ジャンプする」「投げる」「しゃべる」という動作(メソッド)を実行するわけです。
そして、属性はメソッドの中に組み込むことができます。
「自己紹介する」というメソッドを定義して実行すれば、以下のように動作することができます。
class Human
def initialize(name)
@name = name #属性(プロパティ)を定義
end
def introduce #自己紹介のメソッドを定義
puts "ぼくの名前は#{@name}です" #メソッドの中に属性(プロパティ)を入れている
end
end
yamada = Human.new("yamaday0u") #インスタンスを生成
yamada.introduce #自己紹介のメソッドを実行
$ ruby human.rb #human.rbを実行
ぼくの名前はyamaday0uです #実行結果
まとめ
冒頭の、「クラスは設計図・仕様、インスタンスはクラスを元に生成される個別具体的なデータ」、という結論の意味がつかめたでしょうか?
最後のところで使用しているHuman.new
やyamada.introduce
のようなクラスメソッド、インスタンスメソッドについて過去に記事を投稿しているので、ご興味があれば読んでみてください。
関連投稿記事:【Ruby】クラスメソッドとインスタンスメソッド、クラス変数とインスタンス変数の違い(Qiita)
参考資料
【Ruby】クラスとかインスタンスについて改めて学習してみた(Qiita)
クラス(IT用語辞典 e-Words)
インスタンス(IT用語辞典 e-Words)