DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

オブジェクト、クラス、インスタンスの言葉の意味

オブジェクト、クラス、インスタンスという言葉は、プログラミングの解説書などで頻繁に登場します。ここではこれらの言葉の意味と関係を説明します。

オブジェクトとは?

「オブジェクト」という言葉は、色々な意味で使われます。解説書によって違った意味で使用されている可能性もあります。しかし、.NETプログラミングの本では、次のような意味で使用されていることが多いです。

オブジェクトとは、クラスのインスタンスである

MSDN(「Visual Basic のプログラミング ガイド クラスとオブジェクト」)をはじめ、多くの解説書でこのような意味で使われています。DOBON.NETでもこの意味で使用しています。

それ以外では、特にVB.NET関係の書籍では、フォームを含むコントロールのことを「オブジェクト」と呼んでいる場合もあります。さらに、クラスのことを「オブジェクト」と呼んでいる解説書もあります。

また、オブジェクト指向プログラミングにおける「オブジェクト」は、クラスとインスタンスを含めた考え方のような意味になります。これについては、Wikipediaの「オブジェクト指向プログラミング」や「オブジェクト (プログラミング)」、さらに「第1回 「オブジェクト,クラス,インスタンスの関係」等をご覧ください。

クラスとインスタンスとは?

それでは、「クラス」と「インスタンス」とは何でしょうか?一般的な説明は、

クラスが「型」で、その「実体」がインスタンスである

というものです。あるいは、クラスは「設計図」「定義」「テンプレート(雛形)」などとも説明されることもあります。

より具体的に説明しましょう。クラスを宣言するには、例えば以下のような記述をします。

VB.NET
コードを隠すコードを選択
'クラス
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
C#
コードを隠すコードを選択
//クラス
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クラスのインスタンスを作成し、プロパティの値を変更し、メソッドを呼び出す例を示します。

VB.NET
コードを隠すコードを選択
'インスタンスを作成する
Dim sqr As New Square()

'プロパティを変更する
sqr.Height = 100
'メソッドを呼び出す
Console.WriteLine(sqr.GetArea())
C#
コードを隠すコードを選択
//インスタンスを作成する
Square sqr = new Square();

//プロパティを変更する
sqr.Height = 100;
//メソッドを呼び出す
Console.WriteLine(sqr.GetArea());

クラスが定義されていれば、そのクラスのインスタンスは簡単に幾つでも(メモリの限界はありますが)作成することが出来ます。また、それぞれのインスタンスは別のものですので、それぞれ別のデータ(プロパティ値など)を持つことが出来ます。

これが、クラスが「型」でその「実体」がインスタンスであるという意味です。

注意:クラスの実体がインスタンスということは、構造体の実体はインスタンスではないのかということになってしまいますが、少なくともこのサイトでは、構造体の実体もインスタンスと呼んでいます。(さらに言えば、例えば、アプリケーションの実体についてもインスタンスと呼ぶことがあります。)オブジェクトについても同様で、構造体のインスタンスもオブジェクトと呼んでいます。ただし、構造体の実体をインスタンスと呼ばない解説書もあります。特に、構造体をnewで初期化をしなくても使用できる言語の解説書に多いような気がします。このような解説書では、構造体の実体を「変数」や「(値型)データ」などと呼んでいます。

クラスとインスタンスの説明に用いられる比喩

クラスとインスタンスはいろいろなものに比喩されます。その幾つかを紹介します。

クッキーの抜き型とクッキー

これは、MSDNの「Visual Basic のプログラミング ガイド クラスとオブジェクト」や、その他多くの本で見かけるたとえです。

クッキーの抜き型には、丸や四角、星型などいろいろな形があります。一度クッキーの抜け型を作っておけば、同じ形のクッキーを幾つでも作ることが出来ます。クッキーは実際に食べることが出来ますが、クッキーの型は食べることが出来ません。

ここで言う、クッキーの抜き型が「クラス」であり、クッキーが「インスタンス」です。(また、クッキーの生地はメモリと言えるでしょう。)

補足:「ソフィーの世界」(ヨースタイン・ゴルデル著)という小説では、これと同じたとえがプラトンのイデア説の説明で使われています。これに従えば、イデアがクラスで、現実の物象がインスタンスというたとえも出来そうです。

設計図と製品

クラスが設計図で、その設計図通りに作った製品がインスタンスであるというたとえです。

例えば、テレビを考えてみましょう。テレビの設計図を描いたとしても、実際にテレビが見られる訳ではありません。その設計図を基にして実際にテレビを作れば、テレビを見ることが出来ます。また、テレビをたくさん作ったら、それぞれのテレビは別のチャンネルに合わせることや、別の音量に調節することが出来ます。

金型と製品、鋳型と鋳物

金型とは、金属で出来た製品の型となる鋳型で、例えばこれにプラスチックを注入して製品を作成します。これもクッキーの例と同じです。

たいやきの型とたいやき

これもクッキーの例と同じです。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。