クラスとインスタンス・・・て何?
クラスはね・・・小学校6年の時は3組(クラス)だった・・・などというボケをかますと怒られますね(-_-)/~~~ピシー!ピシー!
こんにちは。ディーキャリアITエキスパート名古屋丸の内オフィスの志村です。
「クラスとインスタンス」・・・う~ん、今、そういうYouTube動画を観てます。この先生、どういうことを言うのか、どう説明するのか、興味深いです。
・・・
ということで、ちょっと観たらね・・・そうか、ツイッターの投稿をサンプルにして・・・ツイッターの投稿一つ一つがインスタンスなんだということね。それでその元になっているのが、先生の言う”テンプレート”としてのクラスなんだね。
なるほど、まあそういう理解でも良いね。
(ツイッターのシステム、実際、そういう造りになっていると想像してます)
オブジェクト指向プログラミングを学ぶ時、その入口で「クラス」があります。
クラスは「オブジェクトの設計図」と言われてます。
それで実体となった時、インスタンスになる。
そういう説明でも・・・いい。というか、わたしも結構そういう説明していますね(笑)
プログラミングの世界では、いろいろな見方・考え方があります。
どういう考え方をしたら、スッキリ分かるか、理解できるか・・・ということが大事なので、ちょっとこういう考え方はどう?・・・っていうのを一つ紹介しましょう。
「クラスというのは変数の型みたいなものです。クラスとして定義した内容を持つ「変数(オブジェクト)」を、いよいよ使いたい時に(個別に)名前を付ける。名前の付いたものがインスタンスです」
分かりますか?
プログラミングをする時に変数を使うじゃないですか。
変数は型をもっている。
JavaとかCとかC++とか・・・コンパイラ型のプログラミング言語を学んだら、分かりますよね。
数値型(整数とか小数)、文字型、文字列型、論理型などがありますね。
データの形式として、配列というデータ構造があります。ハッシュとか連想配列とか、レコードとか構造体というのもある。
変数として扱う”データ”には色々な型がありいろいろな形式があって、どれを使うのか・・・プログラミングでは使う前に(決めて)、型やデータ構造を「宣言して」使います。
どの型なのかを決めることが「宣言」で、実際に使う時に変数の実体がメモリ上にとられます。
メモリ上に取る時は変数の全体を確保する場合もあるし、その変数やデータ構造の先頭部分の番地(アドレス)だけ決めるということもある。
メモリ上に(領域として)とられるタイミングが結構大事で、正に使おうとする時に領域をとる(「メモリを確保」する)場合もあれば、プログラムが動き始めた時に、最初に領域を確保してしまうものもある。
不要になったら、メモリ上の領域を棄てる(「メモリを解放」する)ものもあれば、プログラムが動いている間はずっと確保しっぱなしのものもある。
クラスは「型」で、実際にメモリ上に取る時には「名前」を付けて作ります。
それが「実体(インスタンス)」です。変数には名前を付けますよね・・・それと同じです。
「名前」をつけると・・・ようやく使えます。
そういう「クラス」をプログラムの中で決める。使うものを決めるわけです。
ちょっと複雑な構造の「型」を作っているのです。(^o^)
(これを書いたずっと後で、JavaScriptをまじめに勉強したら、JavaScriptでの変数の形に”オブジェクト型”ってあるのね・苦笑。
それです。JavaScriptの考え方だとまさにオブジェクトは変数の型の一つ。ただし、JavaScriptのオブジェクト型も、中身は自分で定義することになるから、その定義の時点ではクラスということです。)
クラスが使われる時に実体化(メモリ上に領域をとって動き始める)すると、その実体のことをインスタンスと言います。
このクラスとかインスタンスとか・・・こういうもののことを「オブジェクト」と言います。
オブジェクトはプログラムの部品です。・・・というかある種の変数ですね。配列(連想配列?)のような、構造体(レコード?)のようなものと言ってもいい。
部品が何かの機能とか役割を持っている。
おおよそ「処理(関数・メソッド)」が大事ですが、その機能に使うデータやデータの入れ物(プロパティ)まで一緒になっていると、まとめてあって使いやすい時がある。
まず、処理を意識する訳です。
逆に「データの入れ物」を意識して、それがオブジェクトだとして想定しておくこともあります。 データの入れ物ですから、普通の変数でも、配列でも、構造体(レコード)でも何でも入れておける。 それでちょっと考えたら、そのデータをどう扱うかも考えなくちゃいけないから・・・その処理・機能部分(関数・メソッド)も一緒にしておく。
処理、データ・・・どちらから発想してもOK。
変数の新しい型を作って、それを使うのがオブジェクト指向プログラミングです。
見方を変えると今までの既存の型の変数もね、そういう型のオブジェクトだと思えばいい。
文字列変数のね、長さを知りたい時に、文字列.length()とかってするじゃないですか。配列の場合だと、配列.lengthかな?
文字列や配列はオブジェクトだと思えば自然です。length()メソッドや、lengthプロパティがあるってことね。
ということで、オブジェクトって・・・でっかい、でっかい、いろいろつまった変数ですよ。 (ああ・・”でっかい”と言ったのは雰囲気ですから、実際にはでっかくないかもしれません)
中にはね、「処理・機能(メソッド)とデータ(プロパティ)」が入っている・・・玉手箱やぁ。(^o^)いや、宝箱かな。
まあ、どっちでもいいのですが・・・どんなメソッドやプロパティが入っているか・・・楽しみですよね。
ちょっと見にはわからないので、調べるのです。
(まあ、自分でイチから作ったモノだったら、分かってるはずですが。他人が作ったモノを使うこともありますからね)
「オブジェクト」の扱いは面白くて・・・この宝箱は「四次元ポケット」になってましてね(笑)
中の方を探ると・・・別のオブジェクトの遺伝子が入ってるのです。
入っている遺伝子は、そのオブジェクトの親のもので・・・その中にはまた親が・・・ということで、ご先祖様がたくさん入っているという・・・マトリョーシカ(注)のような構造をしてる(笑)
それでその親からの遺伝(「継承」といいます)で機能やデータを引き継いでるから、財産として使えてしまうのですよ(笑)
遺伝子の中には使えそうなんだけれど、ちょっとばかり思ったのと違うのだよ・・・と思うものは、少々上書きすれば、名前は同じままにしといて、中身が違うっていう微妙な調整もできたりする。(「オーバーライド」といいます)
同じ形質を表す遺伝子なんだけれど、ちょっと使い方(受け渡すデータ、引数の個数とか)が違うっていうものもあって、まあ、同じなんだから同じように使いたいよね・・・イイでしょ、同じように使おうよ・・・という曖昧?なことも許してくれる。(「オーバーロード」といいます)
いや、便利な財産だ。ホント、助かるね。
あとは・・・あとは・・・まあ、いろいろな性質があるので、うまく使うと便利なのです。 以下、割愛です。\(^o^)/
気がついたら、そのうちまたお話します。
ちなみにディーキャリアITエキスパート名古屋丸の内オフィスでは、機会があれば話してますね、こういうこと。
さあて・・・今日の記事は今どきのプログラミングの・・・小話・小ネタでした。
ディーキャリアITエキスパート名古屋丸の内オフィス、よろしくお願いしますね。
ディーキャリアITエキスパート名古屋丸の内オフィス
・電話052-218-4877
・メール it-nagoyamarunouchi@dd-career.com
・所在地:〒460-0002
愛知県名古屋市中区丸の内2-17-22丸の内桜通ビル2階
・HP:https://dd-career.com
(注)マトリョーシカ・・・ロシアの伝統的な人形で、大きな人形が入れ物になっていて、その中に同じようなカタチの人形が入っていて、それも入れ物になっていて、さらに小さな同じカタチの人形が入っている。ググったら、写真が出てきますので、それ見てください(笑)
ITエキスパート名古屋丸の内のブログ一覧
オフィス情報
ITエキスパート名古屋丸の内オフィス
- アクセス
- 名古屋市営地下鉄 桜通線/鶴舞線「丸の内駅」3番出口すぐ
- 電話番号
- 052-218-4877