オブジェクト、クラス、インスタンスという言葉は、プログラミングの解説書などで頻繁に登場します。ここではこれらの言葉の意味と関係を説明します。
「オブジェクト」という言葉は、色々な意味で使われます。解説書によって違った意味で使用されている可能性もあります。しかし、.NETプログラミングの本では、次のような意味で使用されていることが多いです。
オブジェクトとは、クラスのインスタンスである
MSDN(「Visual Basic のプログラミング ガイド クラスとオブジェクト」)をはじめ、多くの解説書でこのような意味で使われています。DOBON.NETでもこの意味で使用しています。
それ以外では、特にVB.NET関係の書籍では、フォームを含むコントロールのことを「オブジェクト」と呼んでいる場合もあります。さらに、クラスのことを「オブジェクト」と呼んでいる解説書もあります。
また、オブジェクト指向プログラミングにおける「オブジェクト」は、クラスとインスタンスを含めた考え方のような意味になります。これについては、Wikipediaの「オブジェクト指向プログラミング」や「オブジェクト (プログラミング)」、さらに「第1回 「オブジェクト,クラス,インスタンスの関係」等をご覧ください。
それでは、「クラス」と「インスタンス」とは何でしょうか?一般的な説明は、
クラスが「型」で、その「実体」がインスタンスである
というものです。あるいは、クラスは「設計図」「定義」「テンプレート(雛形)」などとも説明されることもあります。
より具体的に説明しましょう。クラスを宣言するには、例えば以下のような記述をします。
'クラス Public Class Square 'フィールド Private _height As Integer Private _width As Integer 'プロパティ Public Property Height() As Integer Get Return Me._height End Get Set(ByVal value As Integer) Me._height = value End Set End Property Public Property Width() As Integer Get Return Me._width End Get Set(ByVal value As Integer) Me._width = value End Set End Property 'コンストラクタ Public Sub New() Me._height = 10 Me._width = 10 End Sub 'メソッド Public Function GetArea() As Integer Return Me._height * Me._width End Function End Class
//クラス public class Square { //フィールド private int _height; private int _width; //プロパティ public int Height { get { return this._height; } set { this._height = value; } } public int Width { get { return this._width; } set { this._width = value; } } //コンストラクタ public Square() { this._height = 10; this._width = 10; } //メソッド public int GetArea() { return this._height * this._width; } }
ここでは"Square"というクラスを宣言しています。Squareクラスには、2つのフィールドと2つのプロパティ、それに1つのメソッドと1つのコンストラクタがあると定義されています。
ただ、これだけでは「Squareクラスはこのようなクラスですよ」ということを宣言しただけに過ぎません。実際にプロパティに値を入れたり、メソッドを呼び出したりするには、実体であるインスタンスが必要です。インスタンスは、クラスを基にして実際にメモリ上に作成されたデータと言えます。
インスタンスを作成するには、VB.NETでは"New"、C#では"new"キーワードを使用します。このようにインスタンスを作成することを「インスタンス化」といいます。
Squareクラスのインスタンスを作成し、プロパティの値を変更し、メソッドを呼び出す例を示します。
'インスタンスを作成する Dim sqr As New Square() 'プロパティを変更する sqr.Height = 100 'メソッドを呼び出す Console.WriteLine(sqr.GetArea())
//インスタンスを作成する Square sqr = new Square(); //プロパティを変更する sqr.Height = 100; //メソッドを呼び出す Console.WriteLine(sqr.GetArea());
クラスが定義されていれば、そのクラスのインスタンスは簡単に幾つでも(メモリの限界はありますが)作成することが出来ます。また、それぞれのインスタンスは別のものですので、それぞれ別のデータ(プロパティ値など)を持つことが出来ます。
これが、クラスが「型」でその「実体」がインスタンスであるという意味です。
注意:クラスの実体がインスタンスということは、構造体の実体はインスタンスではないのかということになってしまいますが、少なくともこのサイトでは、構造体の実体もインスタンスと呼んでいます。(さらに言えば、例えば、アプリケーションの実体についてもインスタンスと呼ぶことがあります。)オブジェクトについても同様で、構造体のインスタンスもオブジェクトと呼んでいます。ただし、構造体の実体をインスタンスと呼ばない解説書もあります。特に、構造体をnewで初期化をしなくても使用できる言語の解説書に多いような気がします。このような解説書では、構造体の実体を「変数」や「(値型)データ」などと呼んでいます。
クラスとインスタンスはいろいろなものに比喩されます。その幾つかを紹介します。
これは、MSDNの「Visual Basic のプログラミング ガイド クラスとオブジェクト」や、その他多くの本で見かけるたとえです。
クッキーの抜き型には、丸や四角、星型などいろいろな形があります。一度クッキーの抜け型を作っておけば、同じ形のクッキーを幾つでも作ることが出来ます。クッキーは実際に食べることが出来ますが、クッキーの型は食べることが出来ません。
ここで言う、クッキーの抜き型が「クラス」であり、クッキーが「インスタンス」です。(また、クッキーの生地はメモリと言えるでしょう。)
補足:「ソフィーの世界」(ヨースタイン・ゴルデル著)という小説では、これと同じたとえがプラトンのイデア説の説明で使われています。これに従えば、イデアがクラスで、現実の物象がインスタンスというたとえも出来そうです。
クラスが設計図で、その設計図通りに作った製品がインスタンスであるというたとえです。
例えば、テレビを考えてみましょう。テレビの設計図を描いたとしても、実際にテレビが見られる訳ではありません。その設計図を基にして実際にテレビを作れば、テレビを見ることが出来ます。また、テレビをたくさん作ったら、それぞれのテレビは別のチャンネルに合わせることや、別の音量に調節することが出来ます。
金型とは、金属で出来た製品の型となる鋳型で、例えばこれにプラスチックを注入して製品を作成します。これもクッキーの例と同じです。
これもクッキーの例と同じです。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。