インスタンス
計算機科学でのインスタンス(instance)とはオブジェクトの実体のことをいう。instanceは英語で「実例」を意味する。オブジェクト指向言語においては、多くの場合クラスと呼ばれるものを元に作成したオブジェクトの実体を指す。データモデルやオブジェクト指向設計においても用いられる用語である。
インスタンスを生成するプロセスをインスタンス化 (instantiation、動詞形instantiate)という。
目次 |
概要[編集]
インスタンスという言葉は単に実体の意味で使われる事が多く、分野によってインスタンスの意味は異なる。 オブジェクト指向におけるインスタンスという言葉は、元々Smalltalkにおいてオブジェクトのうちインスタンス・オブジェクトとクラス・オブジェクトを区別するために生まれた用語である。
静的型付け言語では見かける事は少ないが、動的型付け言語の多くは、メタクラスをサポートしクラスというオブジェクトが存在している。クラス・オブジェクトは、端的に言えば変数に束縛できるクラスである。クラス・オブジェクト、インスタンス・オブジェクト双方を変数に束縛した際どちらもオブジェクトとして振る舞い見かけ上区別はつかない。例えばクラス・オブジェクト、インスタンス・オブジェクト双方がwithというメソッドを持っていた場合、どちらもwithメッセージを送ってやるとエラーも起こさずそれぞれのメソッドを実行する。ただし、一般的にはクラス・オブジェクトはインスタンス・オブジェクトと異なり、メッセージを送りつけてもクラスメソッドしか実行できない。故にあるクラスから取得したオブジェクトがインスタンスなのかクラスなのか区別する必要があり、このような用語が使われていた。
現在においては、クラスがオブジェクトとして存在しない静的型付言語の知名度が圧倒的であり、動的型付言語でもこのような区分を守って用語を定義していない場合も多くインスタンスとオブジェクトを同義で使われる場合が多い。Objective-CやPythonにおいてはクラス・オブジェクトとインスタンス・オブジェクトの明確な区別が行われている。[1][2]
なお、紛らわしいがクラス・オブジェクトもメタクラスにより生成されたインスタンスである。ただ、実装上そうなっていることが多いだけなので、実装に言及する事がなければクラス・オブジェクトとインスタンス・オブジェクトは対極の存在として扱われる。
インスタンスの喩え[編集]
キー情報毎に発行されるオブジェクト群が、データベースオブジェクト等からそれぞれの求めに応じた情報を自律的に得るため確保されている通信手段。すなわち、相手オブジェクト所有の「フィールド名を持ったメソッド」等を自分のスタンスで利用するため自分の親クラスによって宣言され、付与された機能。
インスタンスとクラスとの関係は、わかりやすく説明するために、しばしば様々なものに喩えられることがある。喩え方によってはかえってわかりづらくなり逆効果になることもある。
設計図[編集]
クラスが設計図に相当し、インスタンスが設計図から作り上げた実物であるという喩え。
プラトンのイデア論による喩え[編集]
プラトン哲学において、クラスがイデアに相当し、そのクラスから実際に生成されるインスタンスがこの現実世界に存在するものを意味する実体と喩えられる。
タグ[編集]
インスタンスは物自体であり、クラスはその物の種類を示すタグであるという喩え[3]。
スタンプ、型抜き[編集]
スタンプ、型抜きがインスタンスを生成するクラスに相当し、スタンプによって押される印。
関連項目[編集]
- ^ Objective-C Runtime Reference[1]
- ^ Classes ― Python v2.7.3 documentation[2]
- ^ 「続・初めてのPerl(オライリージャパン)」等