クラスとは:オブジェクト指向の設計図
C#はオブジェクト指向プログラミング(OOP)言語であり、その中心的な概念が「クラス(class)」です。
クラスとは、特定のデータ(状態)と振る舞い(機能)を一つにまとめた「設計図」のようなものです。
- クラス (設計図): 例:
Vehicle(乗り物) - オブジェクト (インスタンス): 設計図に基づいて作られた「実体」(例:
"Red_Sedan"、"Blue_Truck")
クラスを定義することで、intやstringといった基本的なデータ型だけでは表現できない、複雑な「モノ」や「概念」(例: ユーザー、商品、注文)をプログラム内で独自に定義できます。
C#によるクラスの定義例
まず、クラスの定義と、それを利用するコードの全体像を示します。ここでは「乗り物」を表すVehicleクラスを例にします。
Vehicleクラスの定義
このクラスは、「乗り物のモデル名(ModelName)」「現在の速度(CurrentSpeed)」というデータと、「加速する(Accelerate)」「停止する(Brake)」という振る舞いを持ちます。
using System;
/// <summary>
/// 乗り物を表すクラス(設計図)
/// </summary>
public class Vehicle
{
// 1. フィールド (Field)
// クラスの内部状態を保持する変数。通常 'private' にする。
private int _currentSpeed;
// 2. プロパティ (Property)
// 外部に公開するデータ(フィールドへのアクセスを制御する)
public string ModelName { get; private set; } // 読み取り専用(設定はクラス内部のみ)
public string Color { get; set; } // 読み書き可能
// 3. コンストラクタ (Constructor)
// 'new' キーワードでオブジェクトが生成される瞬間に呼び出されるメソッド。
// オブジェクトの初期化を行う。
public Vehicle(string model, string color)
{
this.ModelName = model;
this.Color = color;
this._currentSpeed = 0; // 速度は 0 で初期化
}
// 4. メソッド (Method)
// オブジェクトの振る舞い(アクション)を定義する。
/// <summary>
/// 指定した量だけ加速する
/// </summary>
public void Accelerate(int amount)
{
if (amount > 0)
{
this._currentSpeed += amount;
Console.WriteLine($"{this.ModelName} が {this._currentSpeed} km/h に加速しました。");
}
}
/// <summary>
/// 速度を 0 にする
/// </summary>
public void Brake()
{
this._currentSpeed = 0;
Console.WriteLine($"{this.ModelName} が停止しました。");
}
}
クラスのインスタンス化(オブジェクトの生成)
classは設計図にすぎません。newキーワードを使ってクラスのコンストラクタを呼び出すことで、初めて「オブジェクト(インスタンス)」として実体化され、使用できるようになります。
using System;
public class Program
{
public static void Main()
{
// 1. 'Vehicle' クラス(設計図)から、'myCar' オブジェクト(実体)を生成
// "new" を呼び出すと、コンストラクタが実行される
var myCar = new Vehicle("Sedan-X100", "Blue");
// 2. プロパティの読み書き
Console.WriteLine($"作成されたモデル: {myCar.ModelName}");
Console.WriteLine($"元の色: {myCar.Color}");
myCar.Color = "Red"; // Color プロパティは書き換え可能
Console.WriteLine($"新しい色: {myCar.Color}");
// 3. メソッドの呼び出し
myCar.Accelerate(50);
myCar.Accelerate(20);
myCar.Brake();
}
}
出力結果:
作成されたモデル: Sedan-X100
元の色: Blue
新しい色: Red
Sedan-X100 が 50 km/h に加速しました。
Sedan-X100 が 70 km/h に加速しました。
Sedan-X100 が停止しました。
1. フィールド (Field)
フィールドは、クラスの内部状態を保持するために使用される変数です。
慣例として、フィールドはprivate(そのクラスの内部からのみアクセス可能)として宣言され、変数名の先頭にはアンダースコア(_)が付けられます(例: _currentSpeed)。
privateにすることで、外部から勝手にmyCar._currentSpeed = -100のように不正な値を書き込まれることを防ぎます。これを「カプセル化」と呼びます。
2. プロパティ (Property)
プロパティは、privateなフィールドに対する「公開窓口(ゲート)」の役割を果たします。{ get; set; }という構文で定義されます。
get: プロパティの値を読み取るときに実行されます。set: プロパティに値を書き込むときに実行されます。
// (例1) 自動実装プロパティ
// 内部にコンパイラが自動でフィールド(バックアップフィールド)を作成する
public string Color { get; set; } // 読み書き可能
// (例2) 読み取り専用プロパティ
public string ModelName { get; private set; }
// 'get' は public (誰でも読める)
// 'set' は private (クラス内部のコンストラクタやメソッドからのみ書き込める)
// (例3) 独自のロジックを持つプロパティ
// _currentSpeed フィールド(実体)に紐づく
public int CurrentSpeed
{
get { return _currentSpeed; }
// 'set' を定義しないことで、外部からの書き込みを禁止している (読み取り専用)
}
3. コンストラクタ (Constructor)
コンストラクタは、newキーワードでオブジェクトが生成されるときに一度だけ呼び出される、特別なメソッドです。
- クラス名と同じ名前で定義します。
- 戻り値(
voidなど)は記述しません。
コンストラクタの主な役割は、オブジェクトが使用可能になる前に、必要な初期値(例: ModelName)をフィールドやプロパティに確実に設定することです。
// Vehicle クラスのコンストラクタ
public Vehicle(string model, string color)
{
// 引数で受け取った値を、プロパティやフィールドに設定する
this.ModelName = model;
this.Color = color;
this._currentSpeed = 0; // 速度は 0 で初期化
}
4. メソッド (Method)
メソッドは、そのオブジェクトが実行できる「振る舞い」や「アクション」を定義する関数です。Vehicleクラスの例では、Accelerate()(加速する)やBrake()(停止する)がメソッドにあたります。
メソッドは、_currentSpeedのようなprivateなフィールドの値を、決められたルール(Accelerateなら増やす、Brakeなら0にする)に従って安全に変更する役割も担います。
// 振る舞い(メソッド)
public void Accelerate(int amount)
{
if (amount > 0)
{
_currentSpeed += amount; // 内部のフィールドを操作
}
}
まとめ
クラスは、C#におけるデータ構造の基本です。
- フィールド:
privateな内部データ。 - プロパティ: データを外部に公開する窓口(カプセル化)。
- コンストラクタ:
new時に呼ばれる初期化処理。 - メソッド: オブジェクトが行う動作。
これら4つの要素をclassとして正しく設計することで、データとそのデータを操作するロジックを一つにまとめ、管理しやすく堅牢なプログラムを構築できます。
