質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

89.23%

オブジェクトとインスタンスの違いがわかりません。(言語問わず)

解決済

回答 7

投稿

  • 評価
  • クリップ 2
  • VIEW 12K+

k_mail

score 83

オブジェクトとインスタンスの違いがわかりません。

以下はvb.netの本からの抜粋です。
グラフィックスの描画をするためのコードです。


ピクチャーボックスへのグラフィックス処理を行うためのグラフィックオブジェクトをgに取得する
グラフィックスオブジェクトgは、絵を描くキャンパスに相当する
Dim g as Graphics = PictureBox1.CreateGraphics()

Dim pen as new Pen(Color.Black)

g.DrawLine(mypen,x1,y1,x2,y2)  //x1,y1は始点(描き始めの座標)、
// x2,y2は終点(描き終わりの座標)を表しています


疑問点としては、変数Penはnew でインスタンス化したものを入れているのに、
なぜ、変数g にはnewをしたものを入れなくてはいいのかです。

ネットで調べるとオブジェクトは型と書いていたのですが、
インスタンス化せずに型のままでは描画できないのではないか?
インスタンス化して初めて描画のためのオブジェクトが作成されるのではないか?
と疑問が残ったのでこちらで質問させていただいています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 7

+5

「言語問わず」とありますので、一般論から述べます。

プログラミング言語でオブジェクト(object)といった場合、その言語において直接扱える何かをさします。だいたい次のような性質を持っています。

  • 何らかの型がある。
  • 変数に代入できる。
  • 関数(メソッド)の引数にできる。
  • 関数(メソッド)の戻り値にできる。
  • それ自体が式であり、任意の式の一部となれる。

※ 静的型付けの場合は、型があっていればという条件があります。

つまり、言ってみれば何らかのデータです。整数であったり、浮動小数点数であったり、文字列であったり、構造体であったり、関数であったり、クラスのインスタンス(後述)であったり、言語によって様々です。これらの性質を直接持つ物を第一級オブジェクト、間接的に同様の事ができる物を第二級オブジェクトと言ったりします。

注意すべきは、オブジェクトはオブジェクト指向だけの概念ではないと言うことです。オブジェクト指向を考慮していないC言語でも整数(int等)や浮動点数少数(double等)、構造体(struct)等のデータはオブジェクトと言います。オブジェクト指向は、こういったオブジェクトを中心に据えてプログラミングする手法なので、オブジェクト指向と言っているに過ぎません。

なお、ここでのオブジェクトは型の事ではありません。何らかの型のデータ自体のことです。ただし、型自体がオブジェクトになる言語も存在します。

さて、次にインスタンス(instance)は、これはオブジェクト指向だけの概念です。クラス(プロトタイプベースの場合はプロトタイプとなるオブジェクトになりますが、以下クラスとまとめて考えます)はオブジェクトの雛形です。その雛形から実際のデータをもつオブジェクトにすることを実体化(インスタンス化)と言い、そのオブジェクトはそのクラスのインスタンスと言われます。

つまり、逆に言うと、インスタンスは何らかのクラスを実体化したオブジェクトであると言えます。インスタンスは常にオブジェクトです。しかし、オブジェクトが必ずしもインスタンスであるとは限りません。言語によってはクラス以外の型が存在し、クラスのインスタンスではないオブジェクト(よくプリミティブ型とか言われる)がある場合もあります。これは言語によって異なり、逆に全てが何からのインスタンスであるという言語もあります。

さて、ここまでは良いですね。こっからが混乱を招くかも知れないところです。言語によってはObjectというクラスが用意されている場合があります。だいたいは最も底にある基底クラスであり、全てのクラスはObjectクラスの派生にすぎないように設計されている場合があります。Objectもクラスですので、Objectクラスのインスタンスも存在します。これをObjectクラスのオブジェクトと言ったりします。

さらに、混乱することを言います。先ほどObjectクラスというものを見てきました。言語によっては、このようなObjectクラスまたはObjectクラスの派生クラスのインスタンスであるオブジェクトをまとめて「オブジェクト型のオブジェクト」と言ったりします。何言っているのかわからない…という感じですが、オブジェクト型では無いオブジェクトもある言語では、それらを区別するためにこのような表現を使います。

もう何が何だがわからない感じですが、実は英語の文章だったらはっきり違いがわかります。「オブジェクト型」と言った場合のオブジェクトはObject(固有名詞)ですが、単にオブジェクトと言ったときはobject(一般名詞)です。日本語の文章にしてしまうと英語の大文字小文字が無くなってしまうのでわかりにくくなっているだけに過ぎません。難しいところですが、文脈によって把握するしかありませんが、元になった英語の文章を読むと理解しやすいかも知れません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/07 20:43

    ご返信が遅くなり申し訳ございません。
    現時点では、理解できなかったですけど、
    長文で回答いただきありがとうございます。
    また、振り返って読み返してみたいと思います。
    ありがとうございます。

    キャンセル

+3

こんにちは。

まず、オブジェクトと言う用語は文脈によって意味が代りますので、あまり厳密に捉えない方がよいです。
クラス型のことをオブジェクトと表現することもあれば、インスタンスのことをオブジェクトと表現することもあります。クラスもインスタンスもごたまぜにしたオブジェクト指向という概念でとらえた方がすっきりするかも知れません。

疑問点としては、変数Penはnew でインスタンス化したものを入れているのに、 
なぜ、変数g にはnewをしたものを入れなくてはいいのかです。

このケースでは単に、PictureBox1.CreateGraphics()の内部でnewしたものを返却しているだけではないかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/07 20:38

    >PictureBox1.CreateGraphics()の内部でnewしたものを返却している

    絶対newがなければいけないと思っていました。
    メソッドが内部でnewしたものを返却するという方法を知り、
    大変勉強になりました。
    ありがとうございます。

    キャンセル

checkベストアンサー

+2

ご質問の表題と内容に若干の飛躍があるように思います。内容の方に関しては他の方が説明されているように、メソッド(関数)の中でnewされていると考えれば簡単に疑問は解決すると思われます。
その上でこちらもチェックしておいていただきたいのですが、インスタンス化しなくても使えるクラス(型)自体に属するメンバ(変数、関数、フィールド、プロパティ、メソッド等々)も存在します。これはプログラムが開始されたときにプログラムのどこかに一カ所だけ最初から作られるものです。この場合、クラスをインスタンス化しなくてもそれらのメンバを使うことが可能です。言語によってやり方は違いますが、通常のメンバとは定義の方法が少し違うはずです。また、名称もクラス自体に属するのでクラスメンバといったり、最初から存在するので静的メンバといったりします。

さて、表題はもっと一般的な話になりますね。言葉の定義は文脈で全く違った意味になることもありますが、一般論の1つとして考えていただき、確認はご自身でお願いします。

インスタンスという言葉が我々の世界(情報工学界?)に広まったのはオブジェクト指向が知られるようになってからだと思います。それまでも、オブジェクトという言葉はありました。c言語のファイルをコンパイルすると拡張子 o のファイルができて、それをオブジェクトファイル、と言ったり。まぁ、単なる「物」ですから、なんにでも当てはめようと思えば当てはめられてしまいますが。
インスタンスというのはオブジェクト指向の用語で、クラスを実体化したオブジェクトのことをいいます。なので、インスタンスはオブジェクトですが、オブジェクトはインスタンスであるとは限らず、イコールではありません。

たとえば、上記のクラスメンバ(クラスをインスタンス化しなくても使えるメンバ)はプログラムがロードされ、意図したプログラムが動き出す前に既に存在する状態になります。つまり、インスタンス化しないオブジェクトということができます。

このような答えでご納得されましたか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/19 22:17

    質問のタイトルと内容が合っていませんでしたね。
    ご指摘ありがとうございました。

    キャンセル

  • 2016/08/20 06:58

    それは気にしなくてもいいと思います。
    今後も臆せずに質問していけばいいと思います。

    キャンセル

+2

クラスをインスタンス化したものがオブジェクトだそうです。
なので、

Dim pen as new Pen(Color.Black)

Penクラスのインスタンスをnew命令で作成して、出来上がったオブジェクトをpenに代入している。
みたいに捉えると良いのではないでしょうか。

Dim g as Graphics = PictureBox1.CreateGraphics()

こちらの場合は、恐らくCreateGraphicsメソッドの中で、
Graphicsクラスをnewして返しているのだと思います。
恐らくというのは、もしかしたら更に別のメソッドを呼んで作っている可能性もあるから。

でもインスタンスとオブジェクトは、ほとんど同じ意味で使うことが多いように思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/07 20:35

    >CreateGraphicsメソッドの中で、
    >Graphicsクラスをnewして返している

    こんなことができるとは知りませんでした。
    ありがとうございます。

    キャンセル

+1

インスタンス化して初めて描画のためのオブジェクトが作成されるのではないか? 
その通りです。この一文をみるとすでにご自身で理解されてるように見えます。

質問への回答ではないのですが、皆さんと違った観点から話をすると、
一人で小さいプログラムを書いているとメリットがわかりにくいと思います。
Penのインスタンスを生成するのに、その場でnewをしていますが、あとからPenの種類が増える(Penを継承したサブクラスを用意する)のであれば、メソッドの中でnewをして(インスタンス化して)戻り値としてオブジェクトを返すようにするほうが変更箇所が少なくて済む(可能性が高い)です。

細かいことをいうとデザインパターンというものがあって、メソッドの戻りでオブジェクトを返すことはfactoryに分類されます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/07 20:33

    >細かいことをいうとデザインパターンというものがあって、メソッドの戻りでオブジェク>トを返すことはfactoryに分類されます。

    細かいことだなんて。。
    非常に勉強になります。
    ありがとうございました。

    キャンセル

0

疑問点としては、変数Penはnew でインスタンス化したものを入れているのに、
なぜ、変数g にはnewをしたものを入れなくてはいいのかです。

大雑把に言うと、オブジェクト指向はデータに仕事をさせます。
当然、どのデータに仕事をさせるかを意識しなければいけません。


Dim g as Graphics = PictureBox1.CreateGraphics()

PictureBox1へのグラフィックス処理を行うためのグラフィックオブジェクト

に対していろいろ操作をこの後したいわけですから、
どこかにある、「PictureBox1へのグラフィックス処理を行うためのグラフィックオブジェクト」を取ってこなければなりません。


Dim pen as new Pen(Color.Black)

別に黒色のPenクラスのインスタンスならなんでもいいので新しく作ってます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-2

PictureBox1.CreateGraphics()ってCreateGraphicsメソッド内部でインスタンスを作って返しているか、静的なインスタンスを返しているかの何方かだと思います。

「オブジェクトは型」と書かれていたのは、Object型(若しくはobject型)のある言語の話だと思います。インスタンスとオブジェクトは同じものです。(前出のオブジェクト型は別の話)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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