これは何?
を拝見し、興味深かったので、適当にググって見つかった記事をななめ読みして分類してみた。
インスタンスはオブジェクトの一種だよ派
C++ に限った話と断りつつ、クラスから作ったものがインスタンス、クラスでないものから作ったものも含めるとオブジェクト、という立場。
基本的にオブジェクト指向では、すべてのモノや事柄を「オブジェクト」として捉えています。この時点ではクラスという概念がなくても、オブジェクトは存在します。一方、インスタンスとはクラスという概念を具象化したものです。Java言語においては、すべてのオブジェクトはクラスから作られますので、すべてのオブジェクト=インスタンスとなります。
とのこと。
■ クラス・インスタンス・オブジェクトの違いは神の気分になるとわかる
インスタンスとは、クラスを元に作り出したオブジェクト
とのこと。
オブジェクトとは、さまざまな実体の総称であり、インスタンスもオブジェクトの1つです。
とのこと。
int a;
の a
はインスタンスなのかどうなのかわからないなぁと思った。
■ 「インスタンス」と「オブジェクト」の違いとは?分かりやすく解釈
「オブジェクト」は「プログラムされて処理できる実体の総称」を意味していますが、「インスタンス」は「クラスを素材として生成されたオブジェクト」を意味しているニュアンスの違いを指摘できます。
あるいは
そのため、「インスタンスはオブジェクトであるが、オブジェクトは必ずしもインスタンスではない」のです。
とのこと。
オブジェクトとインスタンスは同じだよ派
C# の話。
オブジェクトはインスタンスとも呼ばれ
とあるので、同じということだろう。
■ 【図解】オブジェクト指向とは?(クラス・メソッド・インスタンスの意味)
Ruby を念頭に置いている模様。
オブジェクト(インスタンス)
という表現が繰り替えしでてきていているので、明確には書かれていないが オブジェクトとインスタンスは同じ意味だと考えているように見える。
クラスを元にしてオブジェクトを生成することをオブジェクト化またはインスタンス化と呼び、そのとき生成されたものをオブジェクトまたはインスタンスと呼びます。
とあるので、同じ意味だという立場なのだろう。
■ 参照、オブジェクト、インスタンス、クラスの違いは何ですか?
Java を念頭に置いている模様。
オブジェクトはインスタンスとも呼ばれます。
とあるので、同じ意味という立場と思われる。
インスタンスとオブジェクトは大体同じ意味なのであまり深く考えず、オブジェクト=インスタンスくらいの感覚で覚えておきましょう。
とある。大体同じという立場だが、細かく見たらどう違うかについては言及がない。
オブジェクトは型だよ派
■ 【Java】オブジェクトとは?~インスタンスやクラスについても解説~
クラスでは、様々なフィールドやメソッドを持っています。それらをひとまとめにし、ひとつの型としてとらえたものがオブジェクト
型として捉えるとオブジェクトということらしい。
開発の現場などでは、クラスの事をオブジェクトと呼んだり、インスタンスをオブジェクトと呼んだりします
現場は混沌としているらしい。
クラス(レシピ)=インスタンス(実体の中の個体)=オブジェクト(実体の型)と考えれば、カレー(レシピ)=カレー(実体の中の個体)=カレー(実体の型)
やはり、オブジェクトは実体の型ということらしい。
インスタンスはオブジェクトへの参照だよ派
Java を念頭においている模様。
オブジェクトは、このオブジェクトを他のオブジェクトと区別する実際の情報を格納する連続したメモリブロックであり、インスタンスはオブジェクトへの参照です。
とのこと
オブジェクトの意味はふんわりしているよ派
■ インスタンス (instance)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
・ インスタンス:実際に作った物
・ オブジェクト:モノ(クラスとかインスタンスとかをふんわりと表現したもの)
あるいは
・インスタンス:物体
・オブジェクト:概念や物体をふんわりと表現したもの
別の箇所では
・インスタンス:クラスをnewしたもの
・オブジェクト:クラスとかインスタンスとかのこと
となっている。
私の立場
同じ意味と思っていればよくて、あんまり厳密に考えなくていいんじゃない? という感じ。
C++ で以下のような状況だとすると。
T * a = new U;
a
は「Tへのポインタ」という型のオブジェクトを意味する変数だけど、「a は T型のオブジェクト」「a は U型のオブジェクト」「a は Tのインスタンス」「a は Uのインスタンス」という不鮮明なことを言うこともある。
T
や U
は int
などのこともある。「クラスから生成したものがインスタンス」という気分ではない。
違いがあるとすれば、以下のような語法上の違いぐらい。
- 「Tのインスタンス」とは言うけど「Tのオブジェクト」とはあまり言わなくて「T型のオブジェクト」と言いがちかな
- 「Tインスタンス」とはあまり言わないけど「Tオブジェクト」ということはあるかな
- 「インスタンス」は単体ではあんまり使わなくて「Tのインスタンス」と、型名とセットで使いがちだけど「オブジェクト」は単体でも普通に使うかな
C/C++ の世界観では、メモリの塊に型を付与するとオブジェクト(=インスタンス)になる感じがする。
Smalltalk や Ruby の世界観には振る舞いが定義されていないメモリの塊がないのでまた違う感じになる。
あと。
クラスがオブジェクトの一種であるかどうかは言語による。
C++ のクラスはオブジェクトじゃないけど、Ruby のクラスはオブジェクト。
まとめ
私の思っている オブジェクト/インスタンス とはぜんぜん違う感覚を持っている人がわりとたくさんいるので驚いた。
あと。
Java の人たちが、 int a;
の a
はオブジェクト(を意味する変数)だったり、int
のインスタンス(を意味する変数)だと思っているのかどうかが気になった。
int
は Object
じゃないから、 a
はインスタンスであってオブジェクトじゃない、ということかなぁ。
同じものを指しているけど、言いたいことが違うよ派
2022.9.19 追記
Cubbit (cubbit2) さんのツイートにま出会って、そうだよなと思ったので追記。
なるほどそういう風に私も感じていたけど言語化できていなかったんだな。という気分。
「T のインスタンス」「T型のオブジェクト」とは言うけど、「Tのオブジェクト」とは言わないのはそういうことなんだなと。