オブジェクトとは - Cocoaプログラミング

オブジェクト? クラス? インスタンス? なんだかよくわからない人のために

てくっち

オブジェクトについて話します!

和田

オブジェクト指向のオブジェクトですねっ!

てくっち

そうです。ある意味、最初の壁になっているかもしれませんね。

てくっち

ここで、なにやらたとえ話とか高尚な概念を持ち出して初心者をびびらすかのような説明はしないわよ!

和田

あら!さすが汁!

和田

たとえ話がいいな!

てくっち

えーーw

和田

オブジェクトをうんことするとインスタンスはハエみたいなものみたいな。

てくっち

それは違うような…

和田

…。

てくっち

所詮はコンピュータ、ビビることはない!ということで、ひとことでいうと、

和田

ひとことでいうと!?

てくっち

オブジェクト=「変数と関数をひとまとめにしたもの」

和田

わかりづらーいw

てくっち

むぅ!

和田

もっとこう日用品に例えてくださいよっ!

てくっち

「オブジェクトは、専用の変数と関数を持っている」

てくっち

うーーん

和田

和田ならこう例えますよ

和田

オブジェクトは家族みたいなものとね!

てくっち

どういうことですかw

和田

アプリが国家でOSが地球というとこでしょうか

和田

ようは最小規模の自治体が家族じゃないですか

和田

そして、それらの小規模自治体を統括するのがまぁアプリってことで…

和田

あ、わかりづらいかしら…

てくっち

はい、とても…

和田

くぅ!

和田

わかった!いきなりオブジェクトに行くから駄目なんですよっ!

和田

まず変数と関数を説明してからオブジェクトに行きましょう!

てくっち

やはりまずコンピュータ寄りの理解がいいのではないかと思います!

和田

コンピュータより!

てくっち

変数と関数は、Cとかでなじみのアレですよ

和田

ざっくり説明はぶいたー!w

てくっち

変数は、値を格納できる入れ物で、

和田

ダンボール?

てくっち

コンピュータの中だから、RAMですね

和田

RAM!

和田

Randam Access Memory?

てくっち

そうだっちゃ

てくっち

関数は、引数をもとに何か処理をして、値を返すしくみ、だっちゃ

てくっち

(引数がない場合とか、値を返さない場合もあるっちゃ)

和田

それちょっと説明が難しく無いですか…

てくっち

むぅ!

てくっち

よし、関数の説明はあとまわしにする!

和田

あとまわしぅ!

てくっち

そしてたとえ話をしますw

てくっち

テレビというオブジェクトを考えましょう。

てくっち

テレビは、内部に変数をたくさん持っています。

和田

おおぉ!それっぽい!

てくっち

電源オン・オフとか、チャンネルの同調周波数とか、音量とか、いろいろ。

和田

おお

和田

はしょった

てくっち

テレビの中身はよく知らないもので…

和田

うそん…

和田

え、ちなみに電源のON/OFFは変数じゃなくて関数じゃないの?

てくっち

ON/OFFの状態を、変数に格納しとくということですね。

てくっち

そのうえで、ON/OFFの操作をする関数も用意する。

和田

なるほど

てくっち

ほかに、チャンネルの変え方とか、音量の変え方とか、いろいろ。

和田

ON/OFF変数ってことですね

和田

ということは実際の各機能が持っている値は変数に格納されて

和田

その機能を使う場合は関数を経由して値に変更を加えるということでしょうか

てくっち

そんな感じです

てくっち

で、テレビの取扱説明書には、関数の使い方が載っているわけです。

てくっち

変数のほうは、企業秘密です。

和田

ほほほぅ!

和田

興味深い!

和田

その取扱説明書にあたるのが…

てくっち

素人がテレビの内部をいじってはいけないのです。

てくっち

素人はテレビの内部を知る必要もない。

和田

ふむふむ

てくっち

関数の使い方さえ変えなければ、こっそり内部の仕組みを変えても、利用者には影響がないんです。

和田

ほう!以前てくさんにきいたことがあるな!

てくっち

調子にのって、もう1つたとえ話をします。

てくっち

市役所。

てくっち

利用者は市役所の窓口に行きますよね。

てくっち

窓口で、いろいろたずねたり、聞いたり。

和田

ほほう

てくっち

窓口が、利用者とのインターフェースになっています

てくっち

これが、市役所オブジェクトの関数にあたります

てくっち

一方で、市役所には内部資料がありますね。

てくっち

こいつらが変数。

和田

あれですか。住基ネットみたいなやつですか。

てくっち

利用者は、内部資料の処理の仕方など、意識する必要がないし、知る術もありません。

和田

ふむふむ!

てくっち

そうですね、住基ネットとか、戸籍とか。

てくっち

とまあ、こういう仕掛けをプログラミングに利用しているわけです。

和田

一般社会とおんなじってことですか先生

てくっち

んーー、責任の所在を明確にするということかな。

和田

プログラミングの中でも責任問題なんですか先生…orz

てくっち

そうですよ

てくっち

画像を描画するオブジェクトの責任とか。

てくっち

そうすると、なにか問題があったときに、誰が悪いのか、わかりやすいし

和田

そういう意味では日本の政治もオブジェクト指向であるべきなんでしょうねぇ

てくっち

まあそうですね

和田

政治の仕組みもある程度はオブジェクト化されていると言えるのでしょうか?

てくっち

で、コンピュータの話に戻りますと

和田

あ、もどっちゃった…

てくっち

まあお役所仕事は、ある意味しっかりしたオブジェクト構造ですよねえ。

和田

脱線させてしまいました…。

てくっち

Xcode上で、しこしこソースを書いていくわけなんですが、

和田

しこしこハァハァ

てくっち

オブジェクトの設計図を書いているわけなんです。

てくっち

変数と関数の。

和田

変数と関数の!

てくっち

この設計図を、クラスといいます。

和田

設計図をクラスと!

和田

それが昨日やったAppController.mと.hですか!?

てくっち

そうですねー

てくっち

クラス名=AppController

和田

なんか見えてきた気がします先生!

てくっち

クラスで決められた設計に基づいて、実際にメモリ上に変数を格納する領域を確保するんです。

てくっち

クラスは設計図ですから、1つあれば、同じ種類のオブジェクトをいくつでも量産できます。

和田

ちょっとまってください

和田

クラスはオブジェクトの設計図。

和田

その設計図をもとに生成されるのがオブジェクト?

てくっち

早まりました。

和田

はやまった!!?

てくっち

設計図をもとに生成された、メモリ上の実体を、インスタンスと呼びます。

和田

メモリ上の実体!ここらへんからなんだか難しくなりますね…

てくっち

うーん、一番具体的だと思いますが…

和田

インスタンス…。IN 酢 タンス…。

てくっち

で、さっき私が早まったのはですね、

和田

へい

てくっち

オブジェクトという用語が、場合によってはクラスの意味にも、インスタンスの意味にも使われちゃってるんですよねー

和田

てくっち

概念があやふやな人は、混乱するでしょうね

和田

すでに混乱してますw

てくっち

うーん、じゃあ、、

てくっち

ソースコードでしこしこ書いたのが、クラス

てくっち

実行時にメモリ上に割り当てられたのが、インスタンス

和田

じゃぁ和田がインスタンスを意識することってあんまない?

てくっち

いや、一番意識しますよー

てくっち

生成したあと、いらなくなったら捨てないとダメでしょ

てくっち

捨てるの忘れると、メモリの無駄遣いになるし。

和田

openとcloseみたいなもんかしら

てくっち

まあそんな感じかも

てくっち

で、以上の考え方をひっくるめて、オブジェクト。

てくっち

これでどうだ!

和田

クラス=設計図

和田

設計図をもとに展開された実体をインスタンス

和田

クラス(設計図)の中には変数や関数が入ってて

和田

で、それらをまとめたのがオブジェクトと!

てくっち

だいたいそんな感じ!

和田

インターフェースビルダーでobjectを追加したじゃないですか先日

てくっち

ええ

和田

あれはあくまで可視化するためのワンクッションであって

和田

実際のオブジェクトはAppControllerオブジェクトとのひもづけのためのプロセスってことですか?

てくっち

えっとですね、実行時に、AppControllerが1つ、インスタンスになるんです

てくっち

つまり、メモリ上に割り当てられる。

和田

へい!

和田

それはなんとなくわかります!

てくっち

次に、そのインスタンスが「初期化」されます

てくっち

初期化については次回以降に!

和田

乞うご期待!

てくっち

で、次に、インターフェースビルダー上で設定してあった接続が、できるんですよ

和田

ほほぅ

和田

あのpushとかあれですよね

てくっち

ええ

和田

fieldとかsenderとか

てくっち

そのへんです

和田

ふむふむ

てくっち

最後に、用語を2つばかり追加しますです。

和田

へい

てくっち

クラス専用の変数と関数といっておりましたが、ほんとは、

てくっち

インスタンス変数と、メソッドと呼んでいます。

和田

最後にそう締めるか!!

和田

わかりやすい!

和田

関数的なものがメソッドですね

てくっち

そうです

てくっち

市役所の窓口です

和田

先生、インスタンス化って言葉ありましたっけ?

てくっち

はい、インスタンスを生成するという意味ですね。

和田

そしてメモリ上に展開されるってことですね

てくっち

ええ。

てくっち

アプリケーションを作るときには、どんなクラスをどのように組み合わせるかを考えてるんですよ。

和田

インタプリタ言語と大きく違う点は、いかに効率的にクラスを組み合わせるかってことでしょうか

てくっち

まあRubyとかはオブジェクト大好きですけどね・・

和田

先生はrubyも行けるんですか!?

てくっち

いけませんw

てくっち

つい入門書買っちゃっただけですw

和田

てくさんに画像を送っているんですが…

和田

お笑い芸人オブジェクトを定義してみたんですが…

てくっち

oo

てくっち

おお

和田

あってますか?w

てくっち

打合わせでネタをつくって(クラス)、舞台で漫才やって(インスタンス)、

てくっち

ツッコミがメソッドですねー

てくっち

まあこんな感じですねw

和田

えがったw

てくっち

前回は、NSButton、NSTextFieldが出てきましたが

てくっち

これ以外のクラスについて、おいおい紹介していきますよー

和田

了解ダス!

和田

おつかれさまでしたっ!

てくっち

おつかれさまでしたー