クラスとインスタンスの違い


私が大学生のアルバイトの方にクラスとインスタンスの違いを説明した時のことです。 参考になれば幸いです。

クラスは設計図、という説明を昔ならしていましたが。それでは static method の説明がし難いので、 クラスは製造機ということにして説明しました。

クラス

クラスは製造マシーン。

インスタンス

インスタンスは製造されたもの

例えば

次のようなクラスを考えてみましょう。

これは、 Coffee を作るマシーンです。 マシーンは常にひとつです。 このコーヒーマシーンには、いくつかの機能があります。 コーヒーの自販機などをイメージするとわかりやすいと思います。

インスタンス化: new

インスタンスを作成する機能があります。 それが new で、 new を実行した時に行われる処理は initialize に書かれています。

マシンの new 機能 を使うとインスタンスができます。 コーヒーマシンの new を使うと 新しいコーヒーができます。

initialize には2つパラメータがあります。 sugar, strength です。 どちらもデフォルトの値が決まっています。 マシンはひとつしかありませんが、インスタンスは複数作ることができ、 それぞれモノとして異なります。 コーヒーマシンから出てきたコーヒーは甘さが同じでも別物です。

作られたインスタンス、各コーヒーは別物です。 sugar, strength が同じであっても別物です。 インスタンス変数 @sugar, @strength は、 各インスタンスの性質を表します。 このコーヒーの砂糖の量は、それぞれのコーヒー(インスタンス)によって違ってきます。 その砂糖の量がそれぞれのインスタンス変数に保存されています。

マシン・インスタンスの機能

コーヒーマシンにはインスタンスを作る new という機能のほかに、 上の例では 10個のコーヒーを一度に作る create_10 という機能があります。 コーヒーの自販機に new のボタンと create_10 のボタンがあると考えてください。

def self.xxxx という書き方で書くと、 self はマシン自身を表し、 マシンの機能を書いたことになります。

一方 def add_sugar などの self のつかないものはコーヒー自身の機能・コーヒーにできることです。

それらの”コーヒーにできること”を記述した部分が、コーヒーの設計図です。 コーヒーマシンは自身の機能と、コーヒーの設計図を持っているんですね。

コーヒーマシン再考

ここまで説明してこなかったものに、 DEFAULT_SUGAR, DEFAULT_STRENGTH があります。 これはなにかというと、コーヒーマシン内部の設定値です。 これを変更するということは、マシンをチューニングするということです。