クラスとは?オブジェクトとの違いを例え話でやさしく解説
ねえテツ、プログラミングの本に「クラス」って出てきたんだけど。これ学校のクラスじゃないよね?(・_・)?
ちげーわ(・∀・) おまえの1年B組の話じゃねーの。
だよね。しかも「クラスからオブジェクトを作る」って書いてあんの。もう1行目から意味わかんない。日本語でよろ(・_・)?
あー、そこな。それ、通帳の話したらイッパツだわ☆彡
クラスとは
クラスとは、オブジェクト指向のプログラミングで使う「同じ種類のものについて、あらかじめ決めておく定義」のことです。そのものが持つデータ(属性)と、そのものにできる操作(メソッド)を1セットにして書きます。このクラスをもとに実際に作り出された実体を、オブジェクト(インスタンス)と呼びます。
クラスは「通帳の様式」
クラスってのはさぁ、銀行の通帳の「様式」なわけ☆彡 口座つくったときにもらう冊子あるっしょ。今はアプリだけの銀行もあるけど、あの紙のやつな。
持ってる持ってる。お年玉入れてるやつ。
アレ、中身まっさらでも、表紙は名前と口座番号を書くとこが決まってて、開いたら日付・お預入れ・お引出し・残高の欄がズラーッと並んでんじゃん?あの「どこに何が入るか」が先に決まってる様式のほう。アレがクラスなわけ。
じゃあ、あたしが持ってる1冊のほうは?
それがオブジェクト。様式から発行された実物な(´∀`)
様式にはお金が入っていない
ちょっと待って。その様式のほうに、お金っていくら入ってんの?見本の通帳に100万とか書いてあったら怖いんだけど(`Д´)ノ
書いてねーよ(≧▽≦) 様式は「欄があるだけ」。金額はゼロすら入ってない、ただの空っぽの決まりごとな。発行されて1冊になって、はじめておまえの名前とおまえの残高が入るわけ。
あー、だからあたしの通帳と友達の通帳で、残高ちがうんだ。
そうそう。様式は同じでも、中身は1冊ごとに別モン。で、通帳ってできることも決まってるっしょ。預ける・下ろす・記帳する。逆に通帳でピザは頼めねーじゃん?その「できることリスト」も様式の段階で決まってんの。プログラムだとソレをメソッドって呼ぶわけ。
じゃあさ、銀行が様式に新しい欄を足したらどうなんの?
そっから発行される通帳、ぜんぶその欄つきになる。1冊ずつ手で直す必要ねーの。プログラムも同じで、クラスを1か所直せば、そこから作るオブジェクト全部にきく。ここがクラスのいちばんオイシイとこなんだわ。
つまり、クラスが通帳の「様式」で、そこから発行された1冊1冊がオブジェクトってコトね!様式には残高が入ってなくて、発行してはじめて自分の名前と残高が入る。しかも「預ける・下ろす」みたいなできることまで、様式の時点で決まってると(☆∀☆)
この例えが当てはまらないところ
通帳は様式が変わっても、すでに手元にある冊子は古いままですが、プログラムではクラスを直すと、そこから作られた既存のオブジェクトの動きまで一斉に変わります。また「様式そのものには数字が入っていない」と説明しましたが、言語によっては、クラスの側に全オブジェクト共通の値を持たせる仕組み(クラス変数など)も用意されています。
まとめ
- クラスは「どんなデータを持ち、何ができるか」をあらかじめ決めた定義です。それ自体は中身の入っていない、通帳の様式のようなものです。
- クラスをもとに作られた実体がオブジェクト(インスタンス)です。同じクラスから作られても、オブジェクトごとに持っているデータは別々です。
- クラスを1か所直せば、そこから作られるオブジェクトすべてに反映されます。同じ種類のものをまとめて扱えることが、クラスを使う一番の利点です。
なお、オブジェクトとインスタンスはほぼ同じ意味で使われる言葉です。「クラスから作り出された」という点を強調したいときにインスタンスと呼ぶことが多い、という程度の違いだと考えて差し支えありません。
関連用語
オブジェクト指向 メソッド プロパティ
