- ベストアンサー
UMLでの「オブジェクト」と「インスタンス」の違い
Java的な概念での説明や、単に「オブジェクト指向」と銘打つHPなどの説明では、「オブジェクト」と「インスタンス」は同じものとして扱われたり、「クラスオブジェクト」「インスタンスオブジェクト」等という言葉を持ち出し、単独の「オブジェクト」という言葉は存在しないなどと取れる説明をしていることが多いように感じます。 しかし、一般的にUMLを元にしたオブジェクト指向の考え方の下では「オブジェクト」と「インスタンス」という言葉は明確に使い分けられており、また「クラス」と「オブジェクト」は対極にあるものとして扱われるため、「クラスオブジェクト」等という言葉が使われることもありません。 下記URLと書籍では、「オブジェクト」と「インスタンス」を明確に使い分けています。 http://www.atmarkit.co.jp/fjava/devs/object04/object04.html テクノロジックアート UMLモデリングL1 P2,3 しかし、この使い分けのニュアンスの違いが理解できません。 オージス総研 初めて学ぶUML 21P では、「型/インスタンス」→「クラス/オブジェクト」という明確な解を提示していますが、微妙な感じだし、何より前出の2者とは明らかに異なる意味合いで使われています。 人によって異なる意味合いで使われているということは理解しています。また、その人による微妙な違いもおおむね理解しているつもりです。しかし、上記の2者のニュアンスだけは理解できない状態です。このニュアンスがわかる方、解説よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
「オブジェクト指向(開発)」や「UML」については まったくわからない者です。 --- さっき本屋で買ってきた 「UMLユーザーガイド」(ピアソンエデュケーション)の 「インスタンス」の章には、 「『クラスのインスタンス』がオブジェクト」 「インスタンスとは、抽象概念の具体的な表れのこと」 「それを踏まえれば、インスタンスはオブジェクトとは限らない (※例えば「関連」のインスタンスは、オブジェクトとは言わない)」 「この「微妙」な違いを「本当に」気にかけるのは、 「深い」経験のある「モデル作成者」だけ」 「インスタンスという用語とオブジェクトという用語は ほとんど同義に使われる」 という主旨のことが書かれています。 (※つまり、インスタンスとは、 「クラスから作られた実体(オブジェクト)」だけを指す用語にとどまらず、 もっと広く「抽象的なものから作られた具体的な何か」を指す用語、 ということだと思うけど…) でもこの本でも、その他の部分では、 2つの用語を「思いっきり同義につかっている」ようです。 --- この解釈は、 質問者さんのお挙げになった 「テクノロジックアート UMLモデリングL1」 「オージス総研 初めて学ぶUML」 の記述と符合するのでは? このページ http://www.atmarkit.co.jp/fjava/devs/object04/object04.html は、「使い分けてはいない」ような気がしますが…。 (というか説明になってないような気がする) --- <オマケコーナー> 「Javaプログラミング」の入門ページですが、 http://www.nextindex.net/java/intro.html http://www.nextindex.net/java/instance.html これの「インスタンスという用語」についての解説を読むと、 「かなり別モノ」のようですが…。 (※この記述がどこまで正しい(※または一般的な)のかはわかりませんが…)
その他の回答 (5)
- choconamacream
- ベストアンサー率44% (152/338)
以下、「プログラマの域を脱していない方の憶測に基づく内容」であるため、あくまで参考程度に…。 今一度、自分の文章を読み返してみましたが、#4では「UMLでもJavaでも同じ」と知ったかぶってたのに、いきなり#5では「開発プロセスによって違う」と、統一されていませんでしたね。英単語の解釈など、全部が全部間違いとは思わないのですが、少しだけこちらの方で補足しておきます。 >もしこれが本当だとすると、「クラス」と対になる言葉は必ず「インスタンス」であり、「クラス」と「オブジェクト」が対になる使われ方はありえないという事になってしまいますが、そのような事実はありません。質問は「UMLモデラーはクラスとオブジェクトは対極にあるものとして扱っていますが、この使い分けのニュアンスの違いを解説してください」です。 結論として、以下のようになるのではないか?、というのが私の個人的な見解です。 ※使い分けのニュアンスの違い 分析・設計フェーズの時 「クラス」と「オブジェクト」が対になって使われる事が多い。 実装フェーズの時 「クラス」と「(クラスの)インスタンス」が対になって使われる事が多い。 ポイントは、「オブジェクト指向の開発プロセスにおいて、いつの段階でクラス図が作成される(もしくは、クラスが抽出される)のか?」ということだと思います。単に、言葉としては、#1さんの言う通り、「オブジェクト」=「クラスのインスタンス」でいいと思うのですが、ここで注意すべき点は、「オブジェクト」=「インスタンス」ではなく、「クラスの」というのが右辺には必要だということです。これを言い換えると、「インスタンス」というのは、どのクラスに属するものなのかが常に必要となってくるので(Javaでいうnew演算子の使用の時など)、それがまだ特定されていない時(クラスがまだない時)は、「インスタンス」ではなく「オブジェクト」という言葉を代わりに使用しておいた方が無難である、という風になると思います。 以上のように考えれば、上記のニュアンスの違いも納得できるものと思います。具体的には、分析・設計フェーズの時には、ユースケース図(アクターやユースケース)やユースケース記述(シナリオやイベントフロー)により、「オブジェクト」が業務レベルで何を指すのかはある程度分るものの、「クラス」がない、もしくはクラス図の作成中だったりするため、UMLモデラーさん達は、上記の2語だけを使用することが多い、と。 はたまた、実装フェーズの段階になってくると、もう既にクラス図やシーケンス図にステートチャート図など、「クラス」と「インスタンス」の両方とも、実際に業務の中で何を指すのかが明白になっているので、わざわざ概念的な言葉(オブジェクト)を使用せずに、抽象(クラス)、具象(インスタンス)の二原論的な考え方をすることが多い、と。 以下、上記の事柄に関するお勧めサイトです。 http://www.engineersguide.jp/Interviews/Yamamoto/UML_Lab02.html あと、以下のサイト内でも、最後の方で次のような記述があります。 http://itpro.nikkeibp.co.jp/free/NIP/NIPCOLUMN/20021225/2/ 「オブジェクト指向は実装を重視する考え方なので,プログラミング言語や開発環境とペアーで利用しないと意味が無いという側面を持つ。このためプログラミング言語やオブジェクト指向開発環境ごとに微妙に異なるオブジェクト指向論が存在することになる。」 質問者さんのおっしゃっている「UMLモデラー」が主にJavaを使用されている方でしたら、ここまでの説明で大丈夫だと思うのですが、もし他の言語(C++,C#,VB.NET,…)の事まで考慮すると、私自身、あまりそちらの方には経験がなかったりするので、もうお手上げ状態です。そうなってくるとやはり、以下のサイトより最新版のUML仕様書(英語)をダウンロードして、調べるしかないように思われます。(何せ、どの国のUMLモデラーさんも、このドキュメントを元にオブジェクト指向をしているはずですから。) http://www.omg.org/technology/documents/formal/uml.htm
お礼
たびたびのご回答ありがとうございます。 http://www.engineersguide.jp/Interviews/Yamamoto/UML_Lab02.html >同じ言葉を用いていても、 >プログラムの実装における「オブジェクト」「クラス」と、 >分析・設計における「オブジェクト」「クラス」は別物なのです。 明確に物語っていますね。表現方法は少し違いますがJavaプログラマとUMLモデラーのオブジェクト指向は異なる概念であるという感じですよね。 >プログラミング言語やオブジェクト指向開発環境ごとに >微妙に異なるオブジェクト指向論が存在することになる。 これも明快ですね。 上記2点から、「なんか自分の概念と異なるオブジェクト指向があるらしい」というレベルから「オブジェクト指向概念は複数存在する」と明確に把握できました。 >「UMLモデラー」が主にJavaを使用されている方でしたら 「オブジェクト指向は実装を重視する考え方なので」とは反する考え方ではありますが、私はUMLとはプログラミング言語に依存せず独立して存在していると思っています。また、実装するプログラミング言語が決定していなくともUMLモデリングは可能と考えています。 「Javaプログラマ」がUMLモデリングを行うことは可能だと思いますが、Javaに縛られている限り「UMLモデラー」ではないという理解をしています。もちろん2つのオブジェクト指向を使い分けることができる人は「Javaプログラマ」でありかつ「UMLモデラー」でもある人だと思います。 で、もともとの質問は「(言語に縛られない)UMLモデラー独自の概念をきちんと理解したい」というのが質問の趣旨でした。この辺は少し解決しない部分が残っていますが、「オブジェクト指向概念は複数存在する」と明確に把握できた点は有益でした。ありがとうございました。
- choconamacream
- ベストアンサー率44% (152/338)
引続き、#4です。 >と、書いておいてなんですが、おぼろげながら分かってきた気がします。UMLでのインスタンスという言葉は、オブジェクトを含んだより大きい概念で、インスタンスに含まれるのはオブジェクトだけではないという感じなんだろうなーと思ってきました。 >(※つまり、インスタンスとは、「クラスから作られた実体(オブジェクト)」だけを指す用語にとどまらず、もっと広く「抽象的なものから作られた具体的な何か」を指す用語、ということだと思うけど…) 「大きい概念」とか「広く」といったような表現が正しいのかどうかは、疑問ですね。単に、「object」や「instance」という言葉が、「object-oriented」よりも前から、英語圏の人達によって使われてきただけですから。もちろん、英語で書かれたCやCOBOLなどのプログラミング書や、はたまた、コンピュータ関連以外の専門書などでも、「object」や「instance」という言葉は、様々な所で使われているでしょうけども。 >「この「微妙」な違いを「本当に」気にかけるのは、「深い」経験のある「モデル作成者」だけ」 そんなに、経験豊富なUMLモデラーさん達を持ち上げることはないと思います。ただ単に、カタカナ語辞典を調べればいいだけですね。 >そういう考えもあるのですか?どういう場面で使われる概念なんですかね… #3さんの具体例を元に説明すると、以下のようにもなるかと。 基本的に、自動車メーカーのCEOやCIOといった、上の人達(経営者さん)にとっては、クラスとかインスタンスよりも、もっと広い意味での、「オブジェクト的な考え方」が、経営戦略やITの有効利用等により必要となってくるはず。 ところが、実際には、R&Dを始めとする研究、開発、設計等に携わっている専門家や技術者さんにとっては、ハイブリッド車の改良など、「クラス的な考え方」をされているはず。 そして、実際にその車を販売し、車検等のメンテナンスなどに携わっている販売員やディーラーさんにとっては、「インスタンス的な考え方」で、常にCSの向上などを目指されているはず。 オブジェクト指向とは、この世の中にある、あらゆるモノを「オブジェクト」とすることであり、その中でもより抽象的なモノを「クラス」、具体的なモノを「インスタンス」としているだけです。 あと、補足的になりますが、以前、C&C++のカテゴリにて、以下のような質問がされていましたが、この中によると、分析・設計などのような上流工程にいけばいく程、「オブジェクト」という言葉を使い、プログラミング・テストなどの下流工程にいけばいく程、「インスタンス」という言葉を使うらしい、とのことです。ただ、実際の所、UMLの様々なモデル図は、要求分析からテストまでのいろんなところで使用されているのですけども。
お礼
>オブジェクト指向とは、この世の中にある、 >あらゆるモノを「オブジェクト」とすることであり、 >その中でもより抽象的なモノを「クラス」、 >具体的なモノを「インスタンス」としているだけです。 もしこれが本当だとすると、「クラス」と対になる言葉は必ず「インスタンス」であり、「クラス」と「オブジェクト」が対になる使われ方はありえないという事になってしまいますが、そのような事実はありません。質問は「UMLモデラーはクラスとオブジェクトは対極にあるものとして扱っていますが、この使い分けのニュアンスの違いを解説してください」です。 >この中によると、分析・設計などのような上流工程にいけばいく程、 >「オブジェクト」という言葉を使い、 >プログラミング・テストなどの下流工程にいけばいく程、 >「インスタンス」という言葉を使うらしい、とのことです。 この方は、JavaプログラマとUMLモデラーの間に相違がありそうだというところに気づき、その違いを説明しようとしているのだと思います。しかしこの説明だと、下流工程ではオブジェクトという言葉は使わない、UMLモデラーはインスタンスという言葉は使わないということが前提でなければ成り立たない理論でありますが、そのような事実もありません。プログラマの域を脱していない方の憶測に基づく内容に感じます。
- choconamacream
- ベストアンサー率44% (152/338)
個人的には、「UMLモデラー」と呼ばれる人達とは一緒に仕事はしたことがないのですが、UMLの独学をしていた「経験者」として、一意見を述べさせて頂きます。 まず始めに、オブジェクト指向というより、コンピュータ関連での「オブジェクト」と「インスタンス」の違いは、以下のようになると思います。 ・「オブジェクト」はその時の状況により、「クラス」や「インスタンス」などのような別の表現で使われることがある。 ・「クラス」は、抽象的な意味を持つオブジェクトであり、反対に「インスタンス」は、具体的な意味を持つオブジェクトである。 以上の2点は、モデリング言語UMLやプログラミング言語Javaにかかわらず、同じオブジェクト指向における概念だと思います。なので、… >私の意見を言わせてもらうと、UMLモデラーとJavaプログラマの間に決定的な認識の差があることは間違いないのですが、 というのが、よく分からないのですが。個人的にはどっちも一緒で、そんなことはないと思います。 勘違いされる要因の一つに、UMLの中でオブジェクト図というのがあります。これはどう考えても「インスタンス図」ですよね。以下のサイト内の、下の方にある【用語解説:オブジェクト】でも、同じような事が書かれています。 http://www.atmarkit.co.jp/fjava/devs/renew_uml01/renew_uml01.html それから、純粋に言葉の持つ意味を知りたければ、辞書、辞典を使えばいいと思います。「e-Words」や「フリー百科事典『ウィキペディア』」でも一応調べてはみたのですが、両者の明確な違いについてまでは、載っていませんでした。ただ、Infoseekのマルチ辞書ではおもしろい結果が得られました。以下がその内容です。 国語辞典 オブジェクト→一般的な意味のみ。 インスタンス→該当する項目なし。 カタカナ語辞典 オブジェクト→一般的な意味と、コンピュータ用の両方とも。 インスタンス→一般的な意味のみ。 英和辞典 object→一般的な意味と、コンピュータ用の両方とも。 instance→一般的な意味と、コンピュータ用の両方とも。 以上の結果を元に考察すると、英語圏では常に、どちらの意味で使用されているのかを文脈や前後関係などから解釈しているので、それほど問題はないけれども、日本語の場合、現時点(2005年)ではまだ、「インスタンス」などの言葉がそれほど普及していないため、誤解を生じる場合がある、と言えます。 そのような事を考慮してか、以下のサイト内でも、「説明」の下の方で次のように記されています。 http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000063.html 引用箇所→「さらに、『インスタンス』がそのものずばり『実体』としての意味として使用されることがあるため、特に英文に出てきた場合には文脈から把握する必要がある。」 以上の事柄もろもろを踏まえた上で…。 >(※例えば「関連」のインスタンスは、オブジェクトとは言わない) この日本語の表現に、ものすごく違和感があるのは、僕だけでしょうか?なんでわざわざ、カタカナ語辞典にしか載っていないような言葉で説明するかなー、って感じ。ちなみに、私が独学の時に使用していた本(「10日でおぼえるUML入門教室」、著者:株式会社オージス総研、発行所:株式会社翔泳社)では、p.87の「関連」の説明にて、次のように表現されています。 「インスタンス同士にリンク(つながり)がある場合、普通、各インスタンスに対応するクラス間に関連があるといえます。クラスから具体例を作成したものがインスタンス(オブジェクト)であるのに対して、関連を具体化したものがリンクです。」 専門用語(インスタンス)と一般的な言葉(具体例、具体化)をきれいに使い分けていて、やみくもにカタカナ語(インスタンス)などの使用を避けていますよね。
- masusun
- ベストアンサー率15% (44/285)
ニュアンスは微妙です。 どうとでも解釈できると思いますので正解はないでしょうが、1つの見解として。 自動車工場で車というモノ(オブジェクト)を作りたいときには、 タイヤ、エンジン、シート、ハンドル・・・(インスタンス)を生成して から組み立てて作りますよね。 これは車を主体に捕らえて考えているからですが、 エンジンを主体(オブジェクト)と考えればギアやポンプ、ラジエータ・・・を生成し組み立てる必要があります。 2つのファイルの差分を調べるクラスA DBへデータを登録するクラスB クラスAとBをインスタンス化し実行するクラスC 「差分更新処理」をするということを主体に考えれば、 オブジェクトCはAとBをインスタンス化(インスタンスオブジェクト)し形成されます。 つまり主体をどこに置くかで表現も非常に広義になると思います。 この考え方をすれば、 >では、「型/インスタンス」→「クラス/オブジェクト」と >いう明確な解を提示していますが、 これもなんとなくニュアンスがわかるのではないでしょうか?
お礼
ありがとうございます。 >自動車工場で車というモノ(オブジェクト)を作りたいときには、 >タイヤ、エンジン、シート、ハンドル・・・(インスタンス)を生成して >から組み立てて作りますよね。 > >つまり主体をどこに置くかで表現も非常に広義になると思います。 私の理解したJavaプログラマ的オブジェクト指向ともUMLモデラー的オブジェクト指向とも異なる新たな概念ですね。なんとなくですが、特殊相対性理論の基本概念の説明に似てるなーと感じました。 そういう考えもあるのですか?どういう場面で使われる概念なんですかね…
- Interest
- ベストアンサー率31% (207/659)
そこらへんは、やらしいところですね。 「インスタンス」は「クラス(型)から生成される実体」です。 広義の「オブジェクト」は「一意に識別可能なモノ」です。 狭義では「クラスのインスタンス」になります。 文脈によって使い分けてください。 混乱しそうでしたら、とりあえず「クラスのインスタンスをオブジェクトという」と覚えておけば大丈夫でしょう。
お礼
ご回答ありがとうございます。 …質問が分かりにくかったようですね。すみません。 質問の内容を明確にします。 端的にいうと、UML関連の書籍やHPでは、「オブジェクト」と「インスタンス」を明確に使い分けているのですが、どのようなニュアンスをこめて使い分けているのでしょうか、という感じになります。 より具体的にいうと 下記URL中の http://www.atmarkit.co.jp/fjava/devs/object04/object04.html 【クラスとインスタンス】 「クラスはオブジェクトを抽象化したもの、または同じ特性を持ったオブジェクトの集合です。一般的に1つのクラスは複数のインスタンスを持っています。」 もしくは 下記書籍の テクノロジックアート UMLモデリングL1 P2,3 「オブジェクトはあらゆるモノを指し、属性や操作等の性質を持つ。インスタンスとは、クラスから生成されるオブジェクトのように、抽象的な概念を具象化した実体のこと。」 どちらの文脈中のでも、「オブジェクト」と「インスタンス」という言葉は異なる意味合いを持たせ扱われています。どのような違いをこめて使い分けられているのでしょうか?どちらか片方の文脈でかまわないのでその意味合いの違いを教えてください、という感じです。 と、書いておいてなんですが、おぼろげながら分かってきた気がします。UMLでのインスタンスという言葉は、オブジェクトを含んだより大きい概念で、インスタンスに含まれるのはオブジェクトだけではないという感じなんだろうなーと思ってきました。 私はJavaプログラマーなのですが、Javaプログラマーの中では、「オブジェクト」と「インスタンス」という2つの言葉は「同じ」もしくは「オブジェクトのほうが大きい」という意味合いで使われていることが多いのですが、その両者(UMLモデラーとJavaプログラマー)の間に決定的な認識のずれがあることが原因のような気がしてきました。 どう思いますか?
お礼
>「『クラスのインスタンス』がオブジェクト」 >「それを踏まえれば、インスタンスはオブジェクトとは限らない 非常にわかりやすいですねー。ありがとうございます。 >(※例えば「関連」のインスタンスは、オブジェクトとは言わない)」 そうですよね。関連のインスタンスはリンクと呼ぶはずですから。 >「この「微妙」な違いを「本当に」気にかけるのは、 >「深い」経験のある「モデル作成者」だけ」 なるほどなるほど。超明快ですね。私のおぼろげながらの理解が正しいことがわかりすっきりしました。 >質問者さんのお挙げになった >「テクノロジックアート UMLモデリングL1」 >「オージス総研 初めて学ぶUML」 >の記述と符合するのでは? はい、そのとおりです。 >「Javaプログラミング」の入門ページですが、 >これの「インスタンスという用語」についての解説を読むと、 >「かなり別モノ」のようですが…。 えーと一般的ですよ。Javaプログラマの間では。私にはその認識はあったので、「UMLの認識は違うのかなー」という疑問を持ち質問をした次第です。 まとめるとこんな感じですね。 ●Javaプログラマ等の理解 オブジェクト=インスタンス+クラス or オブジェクト>インスタンス or オブジェクト≒インスタンス or オブジェクト=インスタンス オブジェクトのほうが偉い(大きな概念)と思っている。 ●UMLモデラーの理解 インスタンス=オブジェクト+リンク+その他 or インスタンス>オブジェクト インスタンスのほうが偉い(大きな概念)と思っている。 両者に明確な認識の差があること自体を把握することができ、非常に勉強になりました。ありがとうございました。 私の意見を言わせてもらうと、UMLモデラーとJavaプログラマの間に決定的な認識の差があることは間違いないのですが、だからといってJavaプログラマが間違っているとは思いません。JavaではJavaなりの「オブジェクト」の考え方があり定着しているので、2つの異なる概念が存在しているのであり、その差異を知っていること自体が重要なのだ、と私は思いました。 一般的なJavaプログラマのように、Java的オブジェクト指向しか知らないのはもちろん問題ではあるのですが、自分とは異なる概念を持つものを「間違い」とし、馬鹿にするような傾向のあるUMLモデラーの態度も問題だなーと思いました。