BLOG

クラスとインスタンス・・・て何?

クラスはね・・・小学校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エキスパート名古屋丸の内のブログ一覧
  1. プログラミング学習 “以前”

  2. 障害者雇用(オープン就労)における技術職について

オフィス情報

ITエキスパート名古屋丸の内オフィス

名古屋市営地下鉄 桜通線/鶴舞線「丸の内駅」3番出口すぐ
052-218-4877