クラスとインスタンスの違い、C#におけるnewキーワードの仕組み

2025年7月15日

オブジェクト指向プログラミング(OOP)を学ぶ際、クラスとオブジェクト(インスタンス)という用語が頻出します。また、C#ではこれらを生成するためにnewキーワードが使われます。この資料では、これらの用語の違いや使い方、そしてC#におけるnewキーワードの役割について詳しく解説します。

クラスとは?

クラスは、プログラム内でデータ(属性)とそのデータに対する操作(メソッド)をひとまとめにしたものです。現実世界のモノや概念をプログラム内で表現するためのものです。

例えば、Carというクラスがあるとします。このクラスには、色やメーカーといったデータと、走る、止まるといった動作を定義できます。このCarクラスから作られた具体的なものがオブジェクトです。

オブジェクト(インスタンス)とは?

インスタンスは、クラスから作られた具体的なオブジェクトのことを指します。クラスが設計図なら、インスタンスはその設計図から作られた製品のようなものです。

例えば、Carクラスから作られたmyCaryourCarは、それぞれが異なるインスタンスです。インスタンスは、プログラムが実行されて初めてメモリ上に存在し、操作可能になります。

C#におけるnewキーワードの役割

C#では、オブジェクトを生成するためにnewキーワードが使われます。このnewキーワードは、クラスからインスタンスを作成し、メモリ上に配置する役割を担っています。

例:

Car myCar = new Car();

この例では、Carクラスの新しいインスタンスを生成し、そのインスタンスをmyCarという変数に格納しています。newキーワードによって、以下のことが行われます:

  1. メモリ上にCarクラスのインスタンスのための領域が確保されます。
  2. クラスのコンストラクターが呼び出され、インスタンスの初期化が行われます。
  3. インスタンスへの参照がmyCar変数に格納されます。

newキーワードを使わずにインスタンスを生成することはできません。したがって、C#ではnewがオブジェクトを実体化するための必須要素となります。

この例では、Carクラスの新しいインスタンスを生成し、そのインスタンスをmyCarという変数に格納しています。newキーワードによって、以下のことが行われます:

using System;

public class Car
{
    // ---------------- 属性(プロパティ) ----------------
    public string Color { get; set; }
    public string Maker { get; set; }

    // ---------------- 振る舞い(メソッド) ----------------
    public void Run()  => Console.WriteLine($"{Color} の {Maker} 車が走り出しました。");
    public void Stop() => Console.WriteLine($"{Color} の {Maker} 車が止まりました。");
}

または、

using System;

public class Car
{
    // ---------------- 属性(プロパティ) ----------------
    public string Color { get; set; }
    public string Maker { get; set; }

    // ---------------- 振る舞い(メソッド) ----------------
    public void Run()
    {
        Console.WriteLine($"{Color} の {Maker} 車が走り出しました。");
    }

    public void Stop()
    {
        Console.WriteLine($"{Color} の {Maker} 車が止まりました。");
    }
}

式形式メンバーでの =>
クラスのメソッドを 「たった 1 行の式だけ返す/実行する」 場合、等価です。

// 通常のブロック構文
public int Square(int n)
{
    return n * n;
}

// 式形式(ラムダ記号を使用)
public int Square(int n) => n * n;

使い方イメージ

var myCar = new Car { Color = "オレンジ", Maker = "Nissan" };
myCar.Run();   // → オレンジ の Nissan 車が走り出しました。
myCar.Stop();  // → オレンジ の Nissan 車が止まりました。
  • 色 (Color) と メーカー (Maker) が “属性”
  • Run() と Stop() が “振る舞い(メソッド)”
  • new Car { … } が “new キーワードでインスタンス化” を示しています。

これだけで、イラスト内の概念(クラス/オブジェクト/インスタンス)をコード上で最小限に体験できます。

まとめ

「クラス」「オブジェクト」「インスタンス」「new」を いっぺんに聞くと混乱しやすいので、まずはイメージを分けてみましょう。


1. クラス ── 設計図

  • 役割: どんなデータ(=フィールド・プロパティ)と どんな操作(=メソッド)をセットにするかを決める“型”の宣言。
  • 例え: 住宅メーカーの“間取り図”や“仕様書”。
public class Car     // ここが設計図
{
    public string Color;          // データ
    public string Maker;
    
    public void Run() { /* … */ } // 操作
    public void Stop() { /* … */ }
}

2. オブジェクト(インスタンス)── 出来上がった実物

  • 役割: クラスの定義をもとに、プログラム実行中にメモリ上に置かれた具体物
  • 例え: 実際に建てられた一軒一軒の家。
  • ポイント:
    • 「オブジェクト」と「インスタンス」は ほぼ同義
      • “新しく作られたもの”と強調したい文脈では instance と呼び、
      • プログラム上の “もの” と言いたいときは object と呼ぶ――程度の違い。
Car myCar   = new Car(); // myCar は Car クラスのインスタンス(=オブジェクト)
Car yourCar = new Car(); // yourCar も別のインスタンス

3. newキーワード ── 工場と倉庫の役割

  1. 工場: 設計図(クラス)を見て必要な広さのメモリ領域を確保。
  2. 倉庫整理: デフォルト値 0 / null などで初期化。
  3. 引渡し: 生成したアドレス(参照)を返す。

Car myCar = new Car();
└─ “Car 工場で 1 台製造し、倉庫番号を myCar にメモした” というイメージ


4. まとめ ― 3 行で整理

用語ひとことでイメージ
クラスデータと操作をまとめた“設計図”間取り図
オブジェクト/インスタンス設計図から出来た“具体物”建った家
new設計図 → 実物へ変換する工程工場+倉庫確保

5. つまずきポイントと対処法

よくある疑問コツ
「オブジェクトとインスタンスは違うの?」ほとんど同じ。会話ではどちらを使っても大抵通じる。
「変数とインスタンスの違いは?」変数はラベル(参照を入れる箱)、インスタンスは中身
「new しないと何が起こる?」メモリに実体がない → フィールドやメソッドを呼ぼうとすると NullReferenceException が発生。

もう少し詳しく知りたいときは…

  • メモリの配置や CLR の仕組み(ヒープ/スタック、GC など)を追うと裏側が腑に落ちますが、まずは
    1. クラス=設計図、
    2. new で実体化、
    3. 実体=オブジェクト/インスタンスという 3 段階を押さえれば十分です。

「家の設計図 → 家を建てる → 住所(参照)をメモ」という例えを何度か繰り返すと、自然と区別できるようになります。


この技術資料を通じて、オブジェクトとインスタンス、そしてnewキーワードの理解を深めてください。

以下は、図解で扱った内容をそのままコードに落とし込んだ Car クラス のサンプル例です。クラス設計・プロパティ・メソッド・インスタンス生成という OOP の基本要素を確認するのに適した構成にしています。

// Car.cs
using System;

namespace SampleApp
{
    /// <summary>
    /// 自動車を表すクラス。
    /// 色やメーカーなどの属性(プロパティ)と、
    /// 走る/止まるといった振る舞い(メソッド)を持つ。
    /// </summary>
    public class Car
    {
        // -------------------- プロパティ --------------------
        /// <summary>色</summary>
        public string Color { get; set; }

        /// <summary>メーカー</summary>
        public string Maker { get; set; }

        /// <summary>現在の速度 (km/h)</summary>
        public int Speed { get; private set; }

        // -------------------- コンストラクタ --------------------
        /// <summary>
        /// 色とメーカーを指定して Car を生成する。
        /// </summary>
        public Car(string color, string maker)
        {
            Color  = color;
            Maker  = maker;
            Speed  = 0;
        }

        // -------------------- メソッド --------------------
        /// <summary>
        /// 指定した速度で走行を開始する。
        /// </summary>
        public void Run(int targetSpeed)
        {
            if (targetSpeed < 0) throw new ArgumentOutOfRangeException(nameof(targetSpeed));
            Speed = targetSpeed;
            Console.WriteLine($"{Maker} の {Color} 車が {Speed} km/h で走り始めました。");
        }

        /// <summary>
        /// 車を停止させる。
        /// </summary>
        public void Stop()
        {
            Speed = 0;
            Console.WriteLine($"{Maker} の {Color} 車が停止しました。");
        }

        // -------------------- 補助的なメソッド --------------------
        public override string ToString()
            => $"{Maker} / {Color} / 現在速度: {Speed} km/h";
    }
}

動作確認用の Program.cs

using System;

namespace SampleApp
{
    class Program
    {
        static void Main()
        {
            // new キーワードでメモリ上に実体化(インスタンス生成)
            Car myCar   = new Car("オレンジ", "Nissan");
            Car yourCar = new Car("ターコイズ", "Toyota");

            // 振る舞いを呼び出す
            myCar.Run(60);      // 60 km/h で走行開始
            yourCar.Run(50);    // 50 km/h で走行開始

            Console.WriteLine(myCar);   // ToString() の結果を表示
            Console.WriteLine(yourCar);

            myCar.Stop();       // 停止
            yourCar.Stop();
        }
    }
}

使い方のポイント

要素目的・学習ポイント
プロパティデータのカプセル化(Speed は set を private)
コンストラクタ初期状態で不可欠な情報(色・メーカー)を受け取る
メソッド振る舞い (Run, Stop) を外部に公開
newクラス設計図から実体(オブジェクト/インスタンス)を生成

このサンプルをベースに、継承・インターフェース・イベント などを追加して発展学習していくと、より実践的な OOP の理解につながります。

訪問数 12 回, 今日の訪問数 1回