クラスとインスタンスの違い、C#におけるnewキーワードの仕組み
オブジェクト指向プログラミング(OOP)を学ぶ際、クラスとオブジェクト(インスタンス)という用語が頻出します。また、C#ではこれらを生成するためにnew
キーワードが使われます。この資料では、これらの用語の違いや使い方、そしてC#におけるnew
キーワードの役割について詳しく解説します。
クラスとは?
クラスは、プログラム内でデータ(属性)とそのデータに対する操作(メソッド)をひとまとめにしたものです。現実世界のモノや概念をプログラム内で表現するためのものです。
例えば、Car
というクラスがあるとします。このクラスには、色やメーカーといったデータと、走る、止まるといった動作を定義できます。このCar
クラスから作られた具体的なものがオブジェクトです。
オブジェクト(インスタンス)とは?
インスタンスは、クラスから作られた具体的なオブジェクトのことを指します。クラスが設計図なら、インスタンスはその設計図から作られた製品のようなものです。
例えば、Car
クラスから作られたmyCar
やyourCar
は、それぞれが異なるインスタンスです。インスタンスは、プログラムが実行されて初めてメモリ上に存在し、操作可能になります。
C#におけるnew
キーワードの役割
C#では、オブジェクトを生成するためにnew
キーワードが使われます。このnew
キーワードは、クラスからインスタンスを作成し、メモリ上に配置する役割を担っています。
例:
Car myCar = new Car();

この例では、Car
クラスの新しいインスタンスを生成し、そのインスタンスをmyCar
という変数に格納しています。new
キーワードによって、以下のことが行われます:
- メモリ上に
Car
クラスのインスタンスのための領域が確保されます。 - クラスのコンストラクターが呼び出され、インスタンスの初期化が行われます。
- インスタンスへの参照が
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キーワード ── 工場と倉庫の役割
- 工場: 設計図(クラス)を見て必要な広さのメモリ領域を確保。
- 倉庫整理: デフォルト値 0 / null などで初期化。
- 引渡し: 生成したアドレス(参照)を返す。
Car myCar = new Car();
└─ “Car 工場で 1 台製造し、倉庫番号を myCar にメモした” というイメージ
4. まとめ ― 3 行で整理
用語 | ひとことで | イメージ |
---|---|---|
クラス | データと操作をまとめた“設計図” | 間取り図 |
オブジェクト/インスタンス | 設計図から出来た“具体物” | 建った家 |
new | 設計図 → 実物へ変換する工程 | 工場+倉庫確保 |
5. つまずきポイントと対処法
よくある疑問 | コツ |
---|---|
「オブジェクトとインスタンスは違うの?」 | ほとんど同じ。会話ではどちらを使っても大抵通じる。 |
「変数とインスタンスの違いは?」 | 変数はラベル(参照を入れる箱)、インスタンスは中身。 |
「new しないと何が起こる?」 | メモリに実体がない → フィールドやメソッドを呼ぼうとすると NullReferenceException が発生。 |
もう少し詳しく知りたいときは…
- メモリの配置や CLR の仕組み(ヒープ/スタック、GC など)を追うと裏側が腑に落ちますが、まずは
- クラス=設計図、
- new で実体化、
- 実体=オブジェクト/インスタンスという 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 の理解につながります。
ディスカッション
コメント一覧
まだ、コメントがありません