インスタンスとオブジェクトの違い

どうもJavaを学習していると色々なサイトで「インスタンス」と「オブジェクト」が混同して使用されている為、私も含めオブジェクト指向の初心者の方には混乱する一因にもなっています。一度、自分の頭の中の整理も含めておさらいしてみようと思います。

基本的にオブジェクト指向では、すべてのモノや事柄を「オブジェクト」として捉えています。この時点ではクラスという概念がなくても、オブジェクトは存在します。一方、インスタンスとはクラスという概念を具象化したものです。Java言語においては、すべてのオブジェクトはクラスから作られますので、すべてのオブジェクト=インスタンスとなります。このことから開発現場では「インスタンス」と「オブジェクト」を使い分けずに使用することが多い為、初心者の方が混乱する一因になっているようですね。

  1. ここで少し身近な具体例として「パソコン構成」をクラスに置き換えて考えてみましょう。
  2. パソコンの構成がイメージ出来たでしょうか?
    このままではただの設計図でしかないので、次にパソコンを生成するクラスを作成してみましょう。
  • 12行目でパソコン・クラスのインスタンスを生成しています。この作業を「パソコン・オブジェクトの生成」とか「パソコン・クラスのインスタンス化」という表現をしています。
  • さらにパソコンを注文するお客様のクラスを用意します。
    • パソコン製造業者がいないと、お客様が注文する相手がいませんので、7行目でパソコン製造業者・クラスのインスタンスを生成しています。
    • 10行目でパソコン製造業者のacceptPcOrderメソッドを呼び出す事により、パソコン・クラスのインスタンスを生成し、お客様クラスで使用出来るようにしています。
  • これらのソースコードから「クラス」・「オブジェクト」・「インスタンス」を一覧化してみるとこのようなイメージとなります。
    • 項目     サンプルソースの例だと                備考
      クラスPc、PcManufacture、Customer設計図
      オブジェクトクラスオブジェクト:Pc、PcManufacture、Customer
      インスタンスオブジェクト:pcIns、pcManIns
      設計工程で用いる俗語のようなもの。製造工程ではインスタンスと同義語と思ってもさほど差し支えない。
      インスタンスpcIns、pcManInsクラスを具象化した実体

    どうでしょうか?
    この解説である程度ご理解が進めば幸いです。それにしても日本語って難しいですね・・・。

    「インスタンスとオブジェクトの違い」への2件のフィードバック

    1. オブジェクトが俗語ですか…。
      Smalltalkでは、メッセージを受け取ることが出来るものを指してオブジェクトとといいます。インスタンスもクラスも変数に突っ込んでしまえばメッセージを送る側からすれば区別がつきません。故に基本的にインスタンスにメッセージを送るなどと言わずオブジェクトにメッセージを送ると言います。

      | object |

      “クラスオブジェクトにメッセージを送る。
      object := Example.
      object doSomething.

      “インスタンスオブジェクトにメッセージを送る”
      object := Example new.
      object doSomething.

      インスタンスという言葉の使い方ですが同じクラスのインスタンスとクラスを明確に区別したい時に使ってます。Exampleクラスのオブジェクトでは、クラスオブジェクトを指してるのかインスタンスオブジェクトを指してるのか分かりませんから。

    2. ピンバック: Effective Java (Item01) – コンストラクタの代わりにstatic factoryメソッドの実装を検討せよ – Yasushi Takehara's Blog

    コメントを残す

    メールアドレスが公開されることはありません。

    email confirm*

    post date*