スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

オブジェクト指向入門 第3回 オブジェクトとインスタンス、その違いについて

今回はオブジェクトとインスタンスについてです。
この2つは同じものとみなされる事も多いですが、区別した方がオブジェクト指向を、特にポリモーフィズム理解しやすくなると思います。

まず、それぞれの意味を英和辞典で調べますと、

  ・オブジェクト(object)・・・物、物体
  ・インスタンス(instance)・・・例、実例

と結構意味が違う言葉であることが分かります。

instanceはexampleに近い言葉で、例の内容で使い分けます。

  ・For example, ~ ・・・ある事柄の代表例、典型例を挙げる時
  ・For instance, ~ ・・・ある事柄の論拠となる具体例を挙げる時

オブジェクト指向では、「オブジェクトAはクラスBのインスタンスである」などと使います。

次のような文章を考えてみましょう。

  「スーパースターっているよね。例えばイチローとか・・・」
  「野球選手っているよね。例えばイチローとか・・・」
  「日本人っているよね。例えばイチローとか・・・」

この文章を、オブジェクト指向風に書くと

  ・イチローオブジェクトは、スーパースタークラスのインスタンスである。
  ・イチローオブジェクトは、野球選手クラスのインスタンスである。
  ・イチローオブジェクトは、日本人クラスのインスタンスである。

となります。

なお、便宜上オブジェクトをイチローと呼んでいますが、実はオブジェクト毎に名前は付けません。
名前はインスタンス毎に付けます。

イチローも、日本人インスタンスとしての本名は「鈴木一朗」です。
本名でさえもオブジェクトに直接付けた名前ではありません。もし、イチローがアメリカ国籍を取得したら、本名は"Ichiro Suzuki"になるかもしれません。

俳優や歌手など複数の名前を使い分けている人をイメージすれば、インスタンス毎に名前を付けていることが理解しやすいと思います。
一人の人物オブジェクトが、日本人インスタンス名(本名)と歌手インスタンス名(芸名)とを使い分けています。


今度はラモスの名前の変遷を使って、これをプログラムコードと結び付けてみたいと思います。
以下の例文を、プログラミング言語で表現してみます。

  ・最初は、"Ruy Goncalves Ramos Sobrinho"という名前のブラジル人です。
  ・その後、「ラモス」という登録名のサッカー選手として活動します。
  ・「ラモス瑠偉」という名前で日本人になり、ブラジル人ではなくなります。
  ・引退し、サッカー選手ではなくなります。

これをJava・C#ライクに書くと、次のようになります。

    // 生成直後にブラジル人のインスタンスとなる
    Brazilian RuyGoncalvesRamosSobrinho = new Person();

    // ラモスという名前のサッカー選手のインスタンスとなる
    FootballPlayer Ramos = RuyGoncalvesRamosSobrinho;

    // ラモス瑠偉という名前の日本人インスタンスとなり、ブラジル人のインスタンスではなくなる
    Japanese RamosRuy = RuyGoncalvesRamosSobrinho;
    RuyGoncalvesRamosSobrinho = null;

    // 引退したので、サッカー選手のインスタンスでもなくなる
    Ramos = null;

RuyGoncalvesRamosSobrinho/Ramos/RamosRuyという名前がそれぞれ、Brazilian/FootballPlayer/Japaneseクラスのインスタンスに付いた名前で、new Person()で誕生したオブジェクト自体に付けた名前ではないのが伝わりますでしょうか?

(残念ながら、実際のプログラムではこのような事はできません。これについては、後々の回で書く予定です。)


最後に、プログラムでは通常、オブジェクトをインスタンス用の変数に代入してから使用します。
ケータイを使って、電話したりメールしたりする様子をJava・C#ライクに書いてみます。

    // ケータイを用意する
    MobilePhone mobilePhone = new MobilePhone();

    // まず、ディスプレイを開く
    mobilePhone.OpenDisplay();

    // 電話する
    Phone phone = mobilePhone();
    phone.Call("110");

    // メールする
    EmailClient emailClient = mobilePhone();
    emailClient.Send("xxxx@yyy.zz", "Hello!");

    // 写真を撮る
    Camera camera = mobilePhone();
    camera.TakePicture();

    // ディスプレイを閉じる
    mobilePhone.CloseDisplay();

このように変数に代入する事を「参照する」と言います。
オブジェクトは、参照して使うのが一般的です。


【まとめ】
  ・オブジェクトは物体、インスタンスは実例
  ・1つのオブジェクト(物体)は、様々なクラス(集合)のインスタンス(実例)になれる
  ・名前は、オブジェクトではなく、インスタンスごとに付く
  ・オブジェクトは、通常参照して使う


さて、クラス/オブジェクト/インスタンスの概念がプログラム設計にどのように役立つのでしょうか?
次回から、少しずつ説明したいと思います。
スポンサーサイト

テーマ : ソフトウェア開発
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

No title

> Brazilian RuyGoncalvesRamosSobrinho = new Person();

これだと「人間はブラジル人である」ということになってしまいますね。
また、RuyGoncalvesRamosSobrinho を RamosRuy に代入することでブラジル人から日本人への変化を表しているようですが、そうすると Person は Japanese も継承しているということなので、「人間はブラジル人であり日本人である」となってしまいます。


> なお、便宜上オブジェクトをイチローと呼んでいますが、実はオブジェクトは名前を持ちません。
> 名前はインスタンスが持ちます。

自分は、インスタンスという用語は「何かの実例」という相対的な位置付けを表す用語であると思っています。なので、オブジェクトは名前を持たずインスタンスが名前を持つというのはおかしいと思いました。
きっぽさんとしては、変数に格納された (変数名によってコンテキスト上での意味・役割を与えられた) オブジェクトをインスタンスと呼んでいるのでしょうか?

ググってみたら↓のページが見つかったんですが、自分の考えはこちらに近いです。
http://www.shos.info/develop/oo/ooword.html#objectandinstance


> オブジェクトをインスタンス変数に代入

あれ、記事中のコードではローカル変数を使っているように見えますが…?


> このようにインスタンス変数に代入する事を「参照する」と言います。

代入する事を「参照する」と言うっていうのは何かの書き間違いでしょうか?
変数に格納されているオブジェクトを使用 (取得) する事を「参照する」と言うように思います。

No title

よこけんさん

お久しぶりです。
ネットでやり取りするのは初めてですね。

> Brazilian RuyGoncalvesRamosSobrinho = new Person();

私もラモスの例の様なコードは、実際のプログラムでは問題があると思っています。

今後、
  ・キャストの向き
  ・パワー型
について書く時に「悪い例」として再登場させるつもりでいます。


> オブジェクトは名前を持たずインスタンスが名前を持つというのはおかしいと思いました。

ここは平行線になっちゃうかな?

上の文章を書いている途中に、「オブジェクトの数≠名前の数」かつ「インスタンスの数≒名前の数」に気がついて、ひょっとしてオブジェクト自体は名無しでは?と感じて書き加えたのですが、少し性急だったかもしれませんね。


> きっぽさんとしては、変数に格納された (変数名によってコンテキスト上での意味・役割を与えられた) オブジェクトをインスタンスと呼んでいるのでしょうか?

話が噛み合わないかもしれませんが、「実例」が無難な訳と思います。

もしかしたら、インスタンスのことを「物体の像」と捉えている面もあるかもしれません。

つい先ほど「像」という単語を思いついたところで練りこみ不足なのですが、これを使ってインスタンスの定義を書くと、「インスタンスは、物(オブジェクト)の存在を知覚するための像である。」という感じです。

上の文章のクラスとインスタンスは、UML2.xの
  ・Classifier
  ・InstanceSpecification
に近いと思います。


http://www.shos.info/develop/oo/ooword.html#objectandinstance

こんな凄いページあったんですね。私もインスタンスは同じ認識でいますよ。
その事を、ブログにうまく書けていないですね。



> あれ、記事中のコードではローカル変数を使っているように見えますが…?

わたしが間違えているかもしれませんが、例えば、
  int a = 1;
  int b = a;
と書いたとき、bにaを代入したのではなく、1という「値」を代入したことになると思います。

同じように、
  ClassA a1 = new ClassA();
  ClassA a2 = a1;
と書いたとき、a2にはa1ではなく、new ClassA()の生成物が代入されると思っていました。

この生成物をオブジェクトと書いてみたのですが、間違えてますか?


> 代入する事を「参照する」と言うっていうのは何かの書き間違いでしょうか?

書き間違えてはいませんよ。
勘違いかもしれませんが、代入した時点で参照したことになると思っていました。

参照カウントのインクリメントのタイミングが代入時点だったり、操作の引数でオブジェクトを渡すことを「参照渡し」と呼ぶことがあったり、C++のポインタのことを参照と表現する記事を読んだりした経験が多かったので、「代入=参照」で脳に刷り込まれていました。

No title

> ネットでやり取りするのは初めてですね。

確かに、そうでしたね!
今後とも宜しくお願いします。


> 私もラモスの例の様なコードは、実際のプログラムでは問題があると思っています。

そうでしたか、了解です。


> 「オブジェクトの数≠名前の数」かつ「インスタンスの数≒名前の数」
> 話が噛み合わないかもしれませんが、「実例」が無難な訳と思います。

うーん、話が噛み合わないかもですね。

ラモスの例のコードは実際は問題があるということなので、どこまで引き合いにして良いかわからないですが、
RuyGoncalvesRamosSobrinho, Ramos, RamosRuy のそれぞれに入っている (参照されている) のは、全て同一のオブジェクトですし、全て同一のインスタンスです。Person クラスが Brazilian, FootballPlayer, Japanese を全て継承 (実装) しているのなら、new Person() で生成されたオブジェクトは、生成された時点で Person, Brazilian, FootballPlayer, Japanese のインスタンスであると言えます (※)。変数に格納されたかどうかは関係ないです。
※ バートランド・メイヤーによると、Person に対しては特に「直接インスタンス」と呼ぶそうです。

「インスタンスは同じ認識」とのことですが、上記の認識は一致していますでしょうか?


> この生成物をオブジェクトと書いてみたのですが、間違えてますか?

いや、そういうことではなく、インスタンス変数はインスタンスが持つ属性のことですよね? (対義語は静的変数またはクラス変数)
メソッドの中で宣言される変数は「ローカル変数」だから文章とコードが噛み合っていない、ということを指摘したかったわけです。
で、
「プログラムでは通常、オブジェクトをインスタンス変数に代入してから使用します。」
というのは
「プログラムでは通常、オブジェクトを変数に代入してから使用します。」
の方が正しい、という話に繋がっていくことを期待していました。

インスタンス変数 - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%A4%89%E6%95%B0


> 参照カウントのインクリメントのタイミングが代入時点だったり

なるほど!確かにそうかもしれないです。
オブジェクトへの参照を変数に格納した時から、その変数はオブジェクトを参照している (し続けている) と捉えられますね。


> 操作の引数でオブジェクトを渡すことを「参照渡し」と呼ぶことが

ちょっと話が逸れますが、オブジェクト (の参照) を渡すことを「参照渡し」とは言わないですね。「参照渡し」は変数そのものに対する参照を渡す、特殊な渡し方のことですので。(参照渡しの場合、C# なら ref キーワード、VB なら ByRef キーワードが必要です。)

No title

> 変数に格納されたかどうかは関係ないです。

勘違いさせてしまって申し訳ないです。
そのような主張をするつもりは全く無いです。


> 「インスタンスは同じ認識」とのことですが、上記の認識は一致していますでしょうか?

信じてくれないと思いますが、認識は一致しています。
「直接インスタンス」って表現は初めて知りました。


> インスタンス変数 - Wikipedia

おっと、専門用語だったんですね。
知りませんでした。


> ちょっと話が逸れますが・・・

知ってるよ~

No title

> そのような主張をするつもりは全く無いです。
> 信じてくれないと思いますが、認識は一致しています。

ありゃ、そうでしたか。
うーん、そうするとちょっと話がわからなくなってきました。
一旦引っ込みます。


> 知ってるよ~

おっと、これは失礼しました^^;

承認待ちコメント

このコメントは管理者の承認待ちです
プロフィール

Author:きっぽ

カテゴリ
最新記事
最新コメント
最新トラックバック
月別アーカイブ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。