以下はJavaテキストをC#に書き換えたものです。C#の特徴や構文に合わせて適宜調整しています。


なぜ、インスタンスの理解が重要なのか、その理由

この記事では、弊社の新人エンジニア研修の参考にC#を解説します。

前回はstaticメソッドについて解説しました。今回はインスタンスの活用について解説します。

いままでは話を単純にするためにインスタンスの話題はできるだけ避けてきました。しかし、ここからはいよいよオブジェクト指向の本丸、クラスからインスタンスを作成するということについて学んでいきます。


オブジェクト指向とは何だったか?

Objectとは「モノ」のことです。オブジェクト指向とは、モノの部品を組み合わせてプログラム全体を作り上げる考え方です。

例えば、新人エンジニアの皆さんがお使いのパソコンも多くの部品から構成されています。私たちはそれぞれの部品の内部構造を知らなくても、それらを組み合わせて使うことができます。この考え方をプログラムに応用し、再利用性やメンテナンス性の高いプログラムを作るのがオブジェクト指向です。


C#でのクラスとインスタンス

C#では、クラスを設計図とし、そこからインスタンスを生成します。

using System;

namespace Chap09
{
    public class Example00
    {
        public static void Main()
        {
            // インスタンスを作成
            Window window = new Window();
            window.Width = 1000;
            window.Height = 500;
            window.Display();
        }
    }

    public class Window
    {
        public int Width { get; set; }
        public int Height { get; set; }

        public void Display()
        {
            Console.WriteLine($"Width: {Width}, Height: {Height}");
        }
    }
}


フィールド(インスタンス変数)を持ったクラスの定義

以下は、新人エンジニアクラスを作成した例です。

namespace Chap09
{
    public class NewEngineer
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class Example01
    {
        public static void Main()
        {
            NewEngineer engineer = new NewEngineer();
            Console.WriteLine(engineer.Id);    // デフォルト値 0
            Console.WriteLine(engineer.Name); // デフォルト値 null
        }
    }
}


メソッドを持ったクラスの定義

メソッドを追加してみましょう。

namespace Chap09
{
    public class NewEngineer
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public void Show()
        {
            Console.WriteLine($"私のIDは{Id}、名前は{Name}です。");
        }
    }

    public class Example02
    {
        public static void Main()
        {
            NewEngineer engineer = new NewEngineer { Id = 1, Name = "Yamada" };
            engineer.Show();
        }
    }
}


コンストラクタでの初期化

C#ではコンストラクタを使って初期化することができます。

namespace Chap09
{
    public class NewEngineer
    {
        public int Id { get; }
        public string Name { get; }

        public NewEngineer(int id, string name)
        {
            Id = id;
            Name = name;
        }

        public void Show()
        {
            Console.WriteLine($"ID: {Id}, Name: {Name}");
        }
    }

    public class Example03
    {
        public static void Main()
        {
            NewEngineer engineer = new NewEngineer(2, "Tabuchi");
            engineer.Show();
        }
    }
}


staticフィールドとstaticメソッド

C#ではstaticを使ってクラス全体で共有する変数やメソッドを定義できます。

namespace Chap09
{
    public class NewEngineer
    {
        public static int Count { get; private set; }
        public int Id { get; }
        public string Name { get; }

        public NewEngineer(int id, string name)
        {
            Id = id;
            Name = name;
            Count++;
            Show();
        }

        public void Show()
        {
            Console.WriteLine($"{Id}:{Name} - {Count}人目です。");
        }
    }

    public class Example04
    {
        public static void Main()
        {
            new NewEngineer(1, "Yamazaki");
            new NewEngineer(2, "Imai");
            Console.WriteLine($"クラスの総人数: {NewEngineer.Count}");
        }
    }
}


メモリ管理

C#にはガーベージコレクションの仕組みがあり、不要になったインスタンスは自動的に解放されます。これにより、CやC++のように手動でメモリを管理する必要がありません。







<まとめ:隣の人に正しく説明できたらチェックを付けましょう>

□ 再利用性やメンテナンス性の高いプログラム部品でシステムを組むのがオブジェクト指向である

□ オブジェクト(抽象概念)= クラス(設計図)+ インスタンス(具体的なもの)

□ 個々のインスタンス固有の変数をインスタンスフィールドと呼ぶ(ローカル変数やstatic変数と区別する)

□ C#で使用できる変数の型には値型(Value Type)と参照型(Reference Type)があり、参照型の変数にはインスタンスへの参照が入っている

□ インスタンスの参照をメソッドの引数として渡すことができるが、その時インスタンスはコピーされない

□ コンストラクタとはインスタンスを作り出すメソッドのことであり、クラス名と同じ名前で戻り値はない

□ 個々のインスタンス変数の情報を使うメソッドはインスタンスメソッド、そうではない場合はstaticメソッドとして設計すると良い

□ staticキーワードがついたクラスメンバからインスタンスメンバへのアクセスはできない。インスタンスメンバからクラスメンバのアクセスはできる

これらの基礎をしっかり押さえておくことで、C#プログラミングの理解が深まります。

まとめができたら、アウトプットとして演習問題にチャレンジしましょう。

最後までお読みいただきありがとうございます。