クラス、オブジェクト、インスタンス、メソッドに
ついて教えていただけないでしょうか?

今現在の自分の認識では、乗り物を例にすると、
「乗り物」という大枠がクラス。それを、たとえば
飛行機なり電車なり船なり、より具体的にした
ものがインスタンス=オブジェクト。
その具体化したものの挙動、動作(走るとか飛ぶとか)
がメソッド、という理解です。

ただ、これだとオブジェクトとインスタンスを
同じものとして見てしまっているので、この2つの
違いを明確に説明しろと言われると困ってしまいます。

インスタンスとオブジェクトの違いを明確にした上で
うまく伝えられる方法があれば、ご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (9件)

最初は「オブジェクト=インスタンス」で良いと思います。



ただ、いろいろと細かい話が出てきていますので、私の理解している範囲でアドバイスしたいと思います。

〔オブジェクト〕
設計段階で使う用語です。
クラスオブジェクトとインスタンスオブジェクトの2種類あり、通常単にオブジェクトと言えばインスタンスオブジェクトのことを指すようですが、クラスオブジェクトのことを指すこともあるので注意が必要です。

〔クラス〕
実装段階で使う用語です。
クラスオブジェクトの実装が「クラス」です。
クラスオブジェクトとクラスは完全に一致します。

〔インスタンス〕
実装段階で使う用語です。
インスタンスオブジェクトの実装が「インスタンス」です。
インスタンスオブジェクトとインスタンスは、必ずしも一致しません。
たとえば、C++ であるクラスのインスタンスを new して、ポインタ変数に代入した場合を考えてみます。
インスタンスオブジェクトに相当するのは、そのポインタ変数そのものですよね。
しかし、インスタンスはポインタ変数が指している先、つまりメモリ領域に確保された実体そのものです。

と、まあ、細かいことを言えば、こんな話になりますが、ここまでこだわって話をすることは、まずないでしょう。

設計レベルでは「オブジェクト」、実装レベルでは「インスタンス」と使い分けておけば、とりあえず間違いはないでしょうし、両者を混同したところで話が通じないことはないと思います。

# 私なんか、最初「インスタンスはオブジェクトのちょっとかっこいい
# 呼び方だ(?)」などと思っていましたし。。。
# いや、なんとなく響きがかっこよく聞こえたもので。。。

とりあえずは、こんな感じでいかがでしょうか。
    • good
    • 2

せっかく抽象的なものの考え方をしているわけだから、数学を使えばいいんじゃないかなあ、ってふと思ったんですけど。



まず始めに「違い」についてですが、手短に言えば、以下のようになりますね。

「オブジェクトもクラスもインスタンスもみんな同じもの。じゃあ、厳密にはどう違うのかというと、『クラス』というのは、抽象的な概念を表すオブジェクトのことで、『インスタンス』というのは具体的な実体を表すオブジェクトのこと。」

集合で言えば、「オブジェクト」の中に、「クラス」と「インスタンス」が入っている、といった感じですね。だから、別の表現を使えば、十分条件ではあるけれども、必要条件ではない、という風になると思います。

今度は「明確な説明」についてですが、以下、中学数学で習う図形を元に、オブジェクト指向の概念を解説していきます。

平行四辺形や二等辺三角形もまた、全てオブジェクト。じゃあ、「平行四辺形」オブジェクトというのは、どういう風に定義されているのかというと、「平行四辺形」クラスの中に、「辺」フィールドや「角度」フィールド、はたまた「等しい」メソッドや「平行である」メソッドなどを用いて、決められているわけですね。(ここまでが、プログラム設計。)
そのクラスにより、例えば、初期値を[a=c=2,b=d=3]として「平行四辺形E」インスタンスが新たに作られたり、初期値[A=C=60°,B=D=120°]とする「平行四辺形F」インスタンスが新規に作成されたりするわけですね。(この部分が、プログラミング。)

昨日も、Javaカテゴリ内で、「抽象クラスってなに?」みたいな質問があったのですが、先程、覗いてみると、もう閉め切っていたので、以下にそっちの方も書き記しておきます。

以上の考え方を利用すれば、抽象クラスやインターフェイスなども簡単ですね。例えば、「長方形」クラスや「ひし形」クラスが必要な場合、先に「四角形」抽象クラスを作成しておけば、後はそれを継承するサブクラスをそれぞれ作成することで、「再利用化」を実現できますね。
もちろん、そんなややこしいことをすれば、クラスが増えるだけだし、大きな「長方形」クラスや、長々とした「ひし形」クラスでもいいじゃないか、と思う人がいるかもしれません。ただ、この後にまた、「台形」クラスが必要になったとしましょう。そしたら、抽象クラスがない場合は、また一から冗長的なプログラムを作成していかなくてはなりません。それが、抽象クラスがある場合は、同様にして、それに関するサブクラスを作成するだけでいいわけですね。それと同時に、このように共通とするものを抜き出して「抽象化」しておけば、コーディング時だけでなく、品質面や後々の保守・運用時にも信頼性が高まる事につながります。

>それにしても、オブジェクト指向の解説って、設計レベルのみの解説や実装レベルのみの解説は見かけますが、両者をつなぐ解説ってあまり見ないような気がします。
お勧めとしては、やはりUMLやデザインパターンでしょうか。これらは、オブジェクト指向を元にした技術なので、必然的にオブジェクト指向的なものの考え方も身に付きますから。
    • good
    • 3

No7 ency です。



メソッドについてですが、案外オブジェクト指向で一番やっかいなものかもしれません。

「オブジェクトに送信したメッセージの応答がメソッド」ということになるでしょうか。。。

…何がなにやら、わからないですよね。

メッセージは「オブジェクトに対して要求する処理」のことです。

メソッドは「要求された処理の実現方法」のことです。
# 「応答」というのはそういう意味です。

…いまいちピンときませんか?

設計レベルでは、上記の話だけで事足りると思いますが、いざ実装となったときにどうするの?という話になりますよね。

実装レベルでは、使用する言語の仕様に依存するようです。
C++ や Java に限って言えば、「メッセージを送信する=メソッドがコールされる」という理解で良いと思います。
C++ と Java では、メッセージ送信とメソッドコールは完全に一致します。

hoge.message();

というのは、hoge に対して message() というメッセージを送信する場合の書式になります。

では、このメッセージ処理の実現方法、つまりメソッドはどのように実装すればよいのかといえば…ふつうに以下のように実装しますよね。

# hoge のクラスは Hoge とします。

void Hoge::message( void )
{
/* 何かの処理 */
}

この Hoge::message() の実装を「メソッド」と呼ぶわけです。

C++ や Java の場合、メッセージ送信の処理自体が、メソッドをコールする処理になっています。

ちなみに、C++ ではメッセージとかメソッドとかいう用語は使わずに「メンバ関数」と呼んでいますよね。
ま、より言語実装に近い呼び方になっている、というくらいにとらえておけば良いと思います。

ま、オブジェクトとインスタンスの話といっしょで、ここまで突っ込んで話をすることは、まずないと思います。

う~ん、あまりわかりやすくないかも。。。
余計に混乱させてしまっただけだったりして (?)

それにしても、オブジェクト指向の解説って、設計レベルのみの解説や実装レベルのみの解説は見かけますが、両者をつなぐ解説ってあまり見ないような気がします。

だから、「犬」に「鳴け」というメッセージを送ったら「ワン」という応答が返ってきた、などという分かったような分からないような説明が横行することに(以下略)。
    • good
    • 2

私の経験でいわせて頂くと


クラスその他の概念は概念から入ると失敗します。
私はこれで1年くらいを無為に過ごしました。

結局のところCなりJAVAなりのプログラムを実際に動かして、
あとで概念のつじつまを合わせていく方がいいようです。

なお、概念としてはデザインパターン関係の本が優れていると
多くの人が指摘しています。
    • good
    • 0

●クラス


 ある「もの」がどのようなものであるのかを説明した説明書。

●インスタンス
 「クラス」という説明書に基づいて実体化されたもの
 だからインスタンスは、元にしたクラスの性質を持っている。

 質問文の例でいうと、「ナンバーxxxの電車」のように「これ」と指でさせるもの。


●オブジェクト
 私の感じ方では、場面によってクラスの意味だったり、インスタンスの意味だったりしています。

 私見ですが理由は、

 昔、UMLが出来る前、様々な方法論でそれぞれが勝手に用語を定義していました。
 「オブジェクト」もその1つで、方法論によっては「クラス」の意味だったり「インスタンス」の意味だったりしていました。

 その名残なのではないかと思っています。
    • good
    • 0

#1の方も書いていますが「飛行機」や「電車」はクラスですね。

「乗り物」クラスを基本クラスとするとサブクラスや派生クラスとも呼びます。また「乗り物」クラスは抽象クラスでもあります。余談ですが。

さてオブジェクトとインスタンスの違いですが
オブジェクト…クラスに属する実体
インスタンス…メモリ上にデータを与えたオブジェクト
と分ける事が多いようです。
つまり「インスタンス」は抽象的な単語「オブジェクト」をプログラムと言う世界を強く意識した言い方かなぁと自分では認識しています。経験則ですので外しているかも知れませんが、オブジェクト指向にだけ特化した本では「インスタンス」と言う単語をあまり見かけませんし、プログラミング言語の本では「インスタンス」の方を頻繁に見かけます。
    • good
    • 0

クラスとインスタンスを考えるときには、「インスタンスは複数存在する(できる)」という意識が大切です。



例えば、世界に犬が一匹しかいないとしたら、クラス(犬という種族)と、「ぽちという名前の犬」の違いを説明するのは、かなり大変でしょう。それが、「犬の性質」なのか、「ぽちの性質」なのか区別に困りますから。
※逆に言えば、インスタンスが複数出てこないと、オブジェクト指向の、目だった効果というのもあまり目には見えないものです。

インスタンスは、複数あるものです。
「たま」や「みけ」や。
ですから、クラスとインスタンスを考えるときには、複数あるものがインスタンス、それの共通した部分をくくりだすのがクラスという意識で眺めてみてください。
※普通は、「クラス」という鋳型から、「インスタンス」という具体的なものを生成するという説明をしますが。

メソッドは、インスタンスの行動様式を決めるものです。
これも、通常は、「クラスに属するインスタンスの共通した行動様式」を決めるという理解です。
ただし、(複数ある)インスタンスは、それぞれ個性を持っていますから、同じクラスに属していても、同じ行動をするとは限りません。

あと、オブジェクト指向だと、「メッセージ」という概念もあります。
メソッドとは、「メッセージによって起動される行動」です。

class 犬 { };

犬 pochi();

pochi.hoeru();

というのの、hoeru(); は、ポチへのメッセージです。
C++では、それに対して、hoeru() という関数を実行するので、メッセージとメソッドの区別が明確でないこともありますが。

あるところで読んだ例。

女性クラスの、「奥さん」インスタンスに、「キスをする」というメッセージを送ると、良い雰囲気になる。

女性クラスの、「隣のお姉さん」インスタンスに、「キスをする」というメッセージを送ると、殴られる。
    • good
    • 0

がると申します。


えっと。変にたとえ話をするとかえって話がゆがみますので、たとえ話抜きでプログラムチックに。
C/C++カテゴリなので、C++の流儀で記述をしてみます。

まずクラスとは「型の定義」です。また、クラス内にある各々の関数をメソッドと呼びます。

具体的には、例えば
class foo {
public:
bool set_XX(const string& s) { data_ = s; }
string get_XX(void) { return data_; }

private:
string data_;
};

なんて感じの時に、fooがクラス名で、set_XXyやget_XXがメソッドになります。
またこの定義全体を指してクラスと呼びます。

次に。
実際にこれらを用いるときは、メモリ資源を用いて実態を作ってやる必要があります。
foo f;
foo* f = new foo();
こんな感じでしょうか。これらによって確保された「メモリ上にあるもの」を、インスタンスとかオブジェクトとか呼びます。
どちらかというとインスタンスのほうがより「正しい」言い方ですが。

で、
> ただ、これだとオブジェクトとインスタンスを
> 同じものとして見てしまっているので、この2つの
> 違いを明確に説明しろと言われると困ってしまいます。
の部分ですが。

インスタンスは「実体」です。これは概念に対して実際に使うことが出来るもの、というニュアンスがあります。
一方で、オブジェクトとは元々「対象物」を指し示します。なので、プログラム中というよりは設計中によく飛び交う単語ですね。ちなみにインスタンスはプログラム中によく飛び交う単語です。

そうですねぇ。例えば会員系のサイトの設計をしていたとします。
設計的に「会員オブジェクト」というのが必要であることはすぐにご理解いただけるかと思います。これは「会員」という対象物を指している概念です。設計中は「会員オブジェクト」に対する挙動などが設計されていくことになるかと思います。
一方で、プログラミングに入りますと。まず「会員クラス」の定義があり、それに対してコード中で「会員クラスのインスタンス」を生成(new)、そのインスタンスに対してメソッドを発行したりなんだり…といった事をすることでコーディングが突き進んでいくかと思います。

オブジェクトってのはかなりモヤついた概念なのですが。
こんな感じで少しは理解の一助になりますでしょうか?
    • good
    • 0

乗り物と飛行機、電車という関係は、クラス、サブクラスの説明によくつかわれます。


(意図によってはクラスとインスタンスの関係にもなるかもしれませんが)
クラスとインスタンスの説明としては
クラス:犬に対して、ポチ、シロなどがインスタンスというのがよいかと思います。
理想の世界の犬というものがあり、
犬は食べたり、走ったりする。これがメソッド。
メソッドはクラスで定義しますよね。
それを現実世界に具現化したものがインスタンス、ポチ。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報