目次
私が大学生のアルバイトの方にクラスとインスタンスの違いを説明した時のことです。 参考になれば幸いです。
クラスは設計図、という説明を昔ならしていましたが。それでは static method の説明がし難いので、 クラスは製造機ということにして説明しました。
クラス
クラスは製造マシーン。
インスタンス
インスタンスは製造されたもの
例えば
次のようなクラスを考えてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class Coffee DEFAULT_SUGAR = 3 DEFAULT_STRENGTH = 3 def initialize(sugar = DEFAULT_SUGAR, strength = DEFAULT_STRENGTH) @sugar = sugar @strength = strength end def add_sugar(sugar) @sugar += sugar end def strengthen(step) @strength += step end def self.create_10(sugar = DEFAULT_SUGAR, strength = DEFAULT_STRENGTH) return self.create_many(10, sugar, strength) end private def self.create_many(count, sugar = DEFAULT_SUGAR, strength = DEFAULT_STRENGTH) coffees = [] for i in 1..count coffees.push(Coffee.new(sugar, strength)) end return coffees end end |
これは、 Coffee
を作るマシーンです。 マシーンは常にひとつです。 このコーヒーマシーンには、いくつかの機能があります。 コーヒーの自販機などをイメージするとわかりやすいと思います。
インスタンス化: new
インスタンスを作成する機能があります。 それが new で、 new を実行した時に行われる処理は initialize
に書かれています。
マシンの new 機能 を使うとインスタンスができます。 コーヒーマシンの new を使うと 新しいコーヒーができます。
1 |
coffee = Coffee.new(1, 3) |
initialize には2つパラメータがあります。 sugar
, strength
です。 どちらもデフォルトの値が決まっています。 マシンはひとつしかありませんが、インスタンスは複数作ることができ、 それぞれモノとして異なります。 コーヒーマシンから出てきたコーヒーは甘さが同じでも別物です。
1 2 3 4 |
Coffee.new(1, 3) Coffee.new(1, 2) Coffee.new(2, 3) Coffee.new(3, 3) |
作られたインスタンス、各コーヒーは別物です。 sugar
, strength
が同じであっても別物です。 インスタンス変数 @sugar
, @strength
は、 各インスタンスの性質を表します。 このコーヒーの砂糖の量は、それぞれのコーヒー(インスタンス)によって違ってきます。 その砂糖の量がそれぞれのインスタンス変数に保存されています。
マシン・インスタンスの機能
コーヒーマシンにはインスタンスを作る new
という機能のほかに、 上の例では 10個のコーヒーを一度に作る create_10
という機能があります。 コーヒーの自販機に new
のボタンと create_10
のボタンがあると考えてください。
def self.xxxx
という書き方で書くと、 self
はマシン自身を表し、 マシンの機能を書いたことになります。
一方 def add_sugar
などの self
のつかないものはコーヒー自身の機能・コーヒーにできることです。
それらの”コーヒーにできること”を記述した部分が、コーヒーの設計図です。 コーヒーマシンは自身の機能と、コーヒーの設計図を持っているんですね。
コーヒーマシン再考
ここまで説明してこなかったものに、 DEFAULT_SUGAR
, DEFAULT_STRENGTH
があります。 これはなにかというと、コーヒーマシン内部の設定値です。 これを変更するということは、マシンをチューニングするということです。