オブジェクト指向の意味

解決済

回答 7

投稿

  • 評価
  • クリップ 2
  • VIEW 1,316

kanta_m

score 11

PHPの学習本にオブジェクト指向の説明の箇所があり、下記のように記載されているのですが、
「インスタンス」と「オブジェクト」の違いが理解できません。
違いをお教えいただけないでしょうか。

============================================================
書籍本文

「オブジェクト指向ではプログラムの再利用がしやすいように、クラスという「処理の設計図」からインスタンスと呼ばれる「実体」を作成します。この作成した実体のことをオブジェクトというため、オブジェクト指向と呼ばれています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

checkベストアンサー

+9

簡潔に言えば、どちらもモノとしては同じなのですが、「オブジェクト」は「インスタンス」より広い概念です。

「インスタンス」は、クラスと対応した概念で、「DateTimeのインスタンス」というように使います。こちらを「DateTimeオブジェクト」と言っても間違いではありません。

一方で、「オブジェクト」はクラスに限らず「同じ特徴を持ったもの」みたいに使うこともあります。たとえばインターフェースであるDateTimeInterfaceについて、「DateTimeInterfaceを実装したオブジェクト」あるいは「DateTimeInterfaceオブジェクト」ということはあっても、「DateTimeInterfaceのインスタンス」と呼ばれることはふつうありません。

Javaでの例ですが、他の言語でも概ね同じです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

家を建てる時に設計図を描きます。
設計図を元に家を建てると家が現実の物体として存在するようになります。
このイメージに当てはめて考えると、クラス(家の設計図)をインスタンス化(家の建築)
すると家(オブジェクト)ができあがります。
抽象的な状態の物(クラスという定義)を具現化するとインスタンスになります。
インターフェースは実装する物で具現化する物とは違うのでインスタンスとは表現しません。
インターフェースを含めて全ての型はオブジェクトという表現は可能です。
なのでインスタンスはオブジェクトである、とは言えますがその逆は成立しません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

さて,「ざっくりした」回答をさせていただきます.
イメージしてください.

私達は「人間クラス」の「インスタンス」です.

人間クラスには,「眼の色」や「身長」,「体重」「名前」「性別」…などのオブジェクト(物質)の情報がセットできます.
(書籍で言う「処理の設計図」)

では,この人間クラスを使って,人間を作ってみましょう.
眼の色:黒
身長:160センチ
性別:男
etc...
このようにして属性をセットしていったものをインスタンスと呼びます.

そして,オブジェクトとは,使った設計図(クラス)と作った制作物(インスタンス)を指す言葉です.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/10 13:13

    わかりやすいです
    ありがとうございます

    キャンセル

  • 2017/03/19 12:22

    参考になったようで、嬉しいです

    キャンセル

+2

「インスタンス」と「オブジェクト」の違いが理解できません。 
たしかに、基本同じものだからね
型(クラス)から車ができてその車の実体そのものがオブジェクト
走っている車がインスタンス
なのでアマゾンのクラウドサーバーでは実体をオブジェクトとは呼ばす
インスタンスと呼んでいる
object(物体)とinstance(事実)の違い

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

インスタンスと呼ぶ場合、それは「どのクラスの」という関連がはっきりしているはすです。
「さっきまでここに'子供'が居ました」
「さっきまでここに'息子'が居ました」
後者のほうは恐らく話者か聞き手の子供でしょう。
オブジェクトとインスタンスもこんな感じかも。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

始めに、これからする話はPHP特有のことではなく、プログラミング言語一般で話をします。最後に、PHPに戻ります。


オブジェクトとは何か

オブジェクト(object)という用語はオブジェクト指向(object-oriented)という概念が誕生する以前からありました。むしろ、オブジェクト指向の「オブジェクト」はこのオブジェクトから取られたものです。しかし、オブジェクト指向言語を説明する場合において、しばしばこの話は忘れ去られ、混乱している場合があります。元々の意味のオブジェクトを広義のオブジェクト、そして、オブジェクト指向について限定されたオブジェクトを狭義のオブジェクトとして、説明します。オブジェクトがどちらを意味しているのかは、各言語間でも言語仕様書内での定義が異なり、また、各文章においても、何に言及しているかによって異なります。

広義のオブジェクト

広義のオブジェクトから説明しましょう。この用語はオブジェクト指向とは独立した概念です。

C11仕様書ドラフト(n1570)p.6ではobjectという用語について次のように定義しています。(C11はC言語の2011年版の仕様と言うことです。C言語はオブジェクト指向言語ではありません。)

region of data storage in the execution environment, the contents of which can represent values
実行環境でのデータ記憶域であり、その中身はなんらかの値を表現できる (適当な意訳)

プログラミングでは何かしらのデータを処理します。真偽値、整数、浮動小数点数等の基本的な物から、文字列、複素数、有理数、配列、連想配列、タプル、セットなどより高度な物、そして、複数のデータをまとめた構造体、クラス、レコードと言ったさらに複雑な物まで様々です。これらのデータは何らかの形でコンピュータ上に存在し、記録され、そのデータを表すことができる形式で保存されています。これがオブジェクトです。さらに言うと、プログラミングとは、オブジェクトを作成し、それらを使って加工していくという一連の流れです。

このようにオブジェクトはプログラミングにおいて重要な概念です。一般的に使用されている言語はオブジェクトに対する何らかの操作の集合体で作成されています。オブジェクト指向とは関係がない言語、LISPやC、Haskellにおいてもオブジェクトはオブジェクトです。これが広義のオブジェクトです。

※ プログラミング言語にオブジェクトが必須というわけではありません。BrainfuckやLazy Kにはオブジェクトという概念は存在しませんが、チューリング完全(他のプログラミング言語と同等の計算が可能)です。

狭義のオブジェクト

ここにオブジェクト指向という話が加わると少し様相が変わってきます。オブジェクト指向以前において、オブジェクトと関数は独立でした。それぞれのオブジェクトを加工していく関数群がそれぞれ動くという物でした。パッケージ化やライブラリ化である程度整理はできますが、オブジェクトをどう扱うかは関数に委ねられており、オブジェクトの中身を知らないと関数も作れませんでした。

そこで、オブジェクト同士の相互作用、オブジェクト同士が互いにメッセージを送り、オブジェクト側がそのメッセージをどのように処理するかを決めるという方法を考えました。それがオブジェクト指向です。紆余曲折を経て、メッセージングという側面はSmalltalkやRubyぐらいしか残っていませんが、オブジェクトを中心に考え、オブジェクト側に処理を決定させる(つまり、メソッドを持たせる)というところはあまり変わりありません。そして、カプセル化や多態性などの概念が追加されていきました。

そうなるとオブジェクト指向的な動作ができるなにかだけをオブジェクトというようになりました。これが狭義のオブジェクトです。現代において、オブジェクト指向自体がかなり広い概念と多種多様な実装方法があるため、レシーバとメソッド呼び出しという形(レシーバ.メソッド(引数)またはレシーバ->メソッド(引数))をとるという事ぐらいしか共通点がありませんが、ある言語においてオブジェクト指向におけるオブジェクトというと、このレシーバになれるなんらかのデータを示すことになりました。

狭義のオブジェクトは広義のオブジェクトに常に含まれる形になります。

オブジェクトとインスタンスとの関係

広義のオブジェクトでは、扱っている全てのデータがオブジェクトですので、除け者はいません。なので、狭義のオブジェクト、つまり、オブジェクト指向におけるオブジェクトについて、インスタンスとの関係を述べます。

一般的に、クラスベースのオブジェクト指向において、全てのオブジェクトは何らかのクラスのインスタンスです。例外はありません。

狭義のオブジェクトの話をするときに、オブジェクト指向的に扱えるのがオブジェクトと話したと思います。それは、レシーバになれること、メソッド呼び出し(メッセージ送信)されることを意味します。通常のクラスベースオブジェクト指向ではメソッド呼び出しはそのオブジェクトを形作っているクラスのインスタンスメソッドを見に行きます。つまり、必ず、何らかのクラスのインスタンスである必要があります。抽象クラスやインタフェースというインスタンスを作れない仕組みが用意されている言語もありますが、そこから直接オブジェクトは作れません。それらを継承する具体化されたクラス(一時クラスの場合もある)をインスタンス化することで、はじめてオブジェクトになります。「○○インターフェース(の直接)のインスタンス」は存在しませんが「○○インタフェース(を継承したクラス)のインスタンス」は存在することに注意してください。わかりきっていることのため、後者の意味で使ってもほとんどの場合は通じると思います。

※ Rubyでは、特異メソッドというそのオブジェクト専用のメソッドが定義できますが、そのオブジェクト専用の特異クラス上にインスタンスメソッドとして定義されるという扱いです。

逆にクラスのインスタンスも、例外なく、オブジェクト指向におけるオブジェクトです。つまり、この二つは同じモノを指しています。しかし、「オブジェクト」は先ほども言ったとおり広義のオブジェクトの意味で言われるときがあります。そこでは完全に同じになるというわけではありません。

各言語においてのオブジェクト

ここまでは一般論です。各言語仕様においては、オブジェクトを上のどちらか、または、全く別に定義している場合があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

解説しているサイトを見つけました。

クラス,インスタンス,オブジェクト

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る