PHPの学習本にオブジェクト指向の説明の箇所があり、下記のように記載されているのですが、
「インスタンス」と「オブジェクト」の違いが理解できません。
違いをお教えいただけないでしょうか。
============================================================
書籍本文
「オブジェクト指向ではプログラムの再利用がしやすいように、クラスという「処理の設計図」からインスタンスと呼ばれる「実体」を作成します。この作成した実体のことをオブジェクトというため、オブジェクト指向と呼ばれています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
ベストアンサー
簡潔に言えば、どちらもモノとしては同じなのですが、「オブジェクト」は「インスタンス」より広い概念です。
「インスタンス」は、クラスと対応した概念で、「DateTime
のインスタンス」というように使います。こちらを「DateTime
オブジェクト」と言っても間違いではありません。
一方で、「オブジェクト」はクラスに限らず「同じ特徴を持ったもの」みたいに使うこともあります。たとえばインターフェースであるDateTimeInterface
について、「DateTimeInterface
を実装したオブジェクト」あるいは「DateTimeInterface
オブジェクト」ということはあっても、「DateTimeInterface
のインスタンス」と呼ばれることはふつうありません。
Javaでの例ですが、他の言語でも概ね同じです。
投稿2016/03/16 06:27
総合スコア145183
0
家を建てる時に設計図を描きます。
設計図を元に家を建てると家が現実の物体として存在するようになります。
このイメージに当てはめて考えると、クラス(家の設計図)をインスタンス化(家の建築)
すると家(オブジェクト)ができあがります。
抽象的な状態の物(クラスという定義)を具現化するとインスタンスになります。
インターフェースは実装する物で具現化する物とは違うのでインスタンスとは表現しません。
インターフェースを含めて全ての型はオブジェクトという表現は可能です。
なのでインスタンスはオブジェクトである、とは言えますがその逆は成立しません。
投稿2016/03/16 06:43
総合スコア2160
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
さて,「ざっくりした」回答をさせていただきます.
イメージしてください.
私達は**「人間クラス」の「インスタンス」**です.
人間クラスには,「眼の色」や「身長」,「体重」「名前」「性別」…などのオブジェクト(物質)の情報がセットできます.
(書籍で言う「処理の設計図」)
では,この人間クラスを使って,人間を作ってみましょう.
眼の色:黒
身長:160センチ
性別:男
etc...
このようにして属性をセットしていったものをインスタンスと呼びます.
そして,オブジェクトとは,使った設計図(クラス)と作った制作物(インスタンス)を指す言葉です.
投稿2016/03/16 06:47
編集2016/03/16 06:53総合スコア2004
0
始めに、これからする話は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では、特異メソッドというそのオブジェクト専用のメソッドが定義できますが、そのオブジェクト専用の特異クラス上にインスタンスメソッドとして定義されるという扱いです。
逆にクラスのインスタンスも、例外なく、オブジェクト指向におけるオブジェクトです。つまり、この二つは同じモノを指しています。しかし、「オブジェクト」は先ほども言ったとおり広義のオブジェクトの意味で言われるときがあります。そこでは完全に同じになるというわけではありません。
###各言語においてのオブジェクト
ここまでは一般論です。各言語仕様においては、オブジェクトを上のどちらか、または、全く別に定義している場合があります。
- PHP
PHPでは、オブジェクトはクラスのインスタンスです。狭義のオブジェクトと同じ意味です。
参考: PHP: オブジェクト - Manual
- Java
Javaでは、オブジェクトはクラスのインスタンスと配列です。いわゆる参照型に入る物がオブジェクトです。Javaにおけるオブジェクトは広義のオブジェクトとも狭義のオブジェクトととも異なります。
参考: 4.3.1. Objects | Java Laguage Sepcification - Java SE 8 Edition |
- Ruby
Rubyでは、全てがオブジェクトです。 Rubyにおいて広義のオブジェクトと狭義のオブジェクトは同じ物になります。全てが何らかのクラスのインスタンスです。
参考: オブジェクト - Ruby リファレンスマニュアル
- ECMAScript (JavaScript)
ECMAScriptでは、Object型の何かです。プロパティを持ちます。プロトタイプベースであるため、全く同じというわけではありませんが、狭義のオブジェクトに近いです。
参考: 4.3.3 object | ECMAScript® 2016 Language Specification
投稿2017/03/19 08:34
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
解説しているサイトを見つけました。
投稿2016/03/16 06:32
編集2016/03/16 06:33退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。