計算機科学において、インスタンスとは、ある概念や定義に基づいた具体的な
実体のことを指します。英語の「instance」が「実例」を意味するように、抽象的な概念を具現化したものがインスタンスです。
オブジェクト指向におけるインスタンス
オブジェクト指向プログラミングでは、インスタンスはクラスという設計図に基づいて生成されたオブジェクトの
実体を指します。クラスはオブジェクトの型や構造を定義するものであり、インスタンスはそのクラスの具体的な例として存在します。この概念は、データモデルやオブジェクト指向設計において重要な役割を果たします。
インスタンス化
インスタンスを生成するプロセスは、「インスタンス化 (instantiation)」と呼ばれます。動詞形の「instantiate」が示すように、クラスを元に具体的なオブジェクトを生成する行為です。このプロセスを通じて、クラスという抽象的な定義から、具体的なデータやメソッドを持つオブジェクトが生まれます。
オブジェクト指向の概念
オブジェクト指向におけるクラスや型は、オブジェクトの分類や集合を表します。クラスCのインスタンスとは、まさにその分類(C)に属するオブジェクトを指します。これは、ある抽象的な定義(クラス)を具体的な
実体(インスタンス)として表現するオブジェクト指向の基本概念です。
Smalltalkの影響
Smalltalkの影響が強い言語では、クラス自体もオブジェクトとして扱われることがあります(クラスオブジェクト)。この場合、「クラスCのオブジェクト」という表現が、クラスCに属するオブジェクトとクラスCそのものを表すオブジェクトの両方の意味で使われ、曖昧になることがあります。この曖昧さを避けるために、「クラスCのインスタンス」という表現が用いられます。
クラスオブジェクトに対して、クラスから生成されたオブジェクトを「インスタンスオブジェクト」と呼ぶこともあります。
インスタンスの起源
オブジェクト指向におけるインスタンスの概念は、元々Sketchpadという言語における「Master」から「Instance」を生成する仕組みである「instance drawings」に由来します。C++と並びオブジェクト指向の基礎を築いたSmalltalkがこの関係をクラスとオブジェクトの関係になぞらえ、クラスから生成されたオブジェクトの意味で使い始めたことで定着しました。
クラスオブジェクトとインスタンスオブジェクト
静的型付けのオブジェクト指向言語ではあまり見られませんが、動的型付けのオブジェクト指向言語の多くはメタクラスをサポートし、クラス自体をオブジェクト(クラスオブジェクト)として扱えます。クラスオブジェクトは、変数に束縛できるクラスそのものです。クラスオブジェクトとインスタンスオブジェクトは、変数に束縛された場合、どちらもオブジェクトとして振る舞い、外見上は区別がつきません。
例えば、クラスオブジェクトとインスタンスオブジェクトが両方ともreadFrom:というメソッドを持っていた場合、どちらに#readFrom:メッセージを送ってもエラーは起こらず、それぞれのメソッドが実行されます。Objective-Cや
Pythonのように、クラスオブジェクトとインスタンスオブジェクトを明確に区別する言語もあります。
メタクラスとインスタンス
メタクラスをサポートするシステムでは、クラスオブジェクトもまた別のクラス(メタクラス)のインスタンスである場合があります。したがって、「クラスオブジェクトはインスタンスではない」とは言い切れないため、注意が必要です。
まとめ
インスタンスは、
計算機科学における重要な概念であり、
オブジェクト指向プログラミングにおいては特に中心的な役割を果たします。クラスという抽象的な概念を具体的なオブジェクトとして実現するインスタンスは、ソフトウェア開発において不可欠な要素です。
関連項目
オブジェクト指向プログラミング
オブジェクト (プログラミング)
クラス ([[コンピュータ)]]
オブジェクトライフタイム (ライフサイクル)
外部リンク
*
『インスタンス』 - コトバンク