【C#入門】オブジェクト指向とは?クラス/インスタンスの全体像を解説!

C#を学習で必ず出てくるのがオブジェクト指向という考え方です。

悩んでる人

C#のオブジェクト指向って何?

悩んでる人

クラス、インスタンス、オブジェクトの違いが分からない

C#は、オブジェクト指向をベースにしたプログラミング言語なので、クラス、インスタンスなどを理解しておくことが重要になります。

おしけん

オブジェクト指向は、ざっくり言えば「関連するデータと処理をひとまとめにして、部品のように扱う考え方」です!

本記事では、C#のオブジェクト指向について、全体像を初心者向けにわかりやすく解説します。

この記事を書いた人
  • システムエンジニア10年目
  • 会社員3年⇒フリーランス7年目
  • 保険系 / 物流系 / 鉄道系 / 小売系などのシステム開発に従事
  • プログラミング講師
目次

【C#】オブジェクト指向とは

C#のオブジェクト指向とは、プログラムで扱うデータや処理をオブジェクトという単位で整理する考え方です。

Microsoftの公式ドキュメントでも、C#はオブジェクト指向プログラミングをサポートしており、抽象化・カプセル化・継承・ポリモーフィズムという4つの原則を持つと説明されています。

オブジェクト指向とは、プログラムを部品の組み合わせとして作っていく考え方です。それぞれの部品(オブジェクト)が、データと処理をひとまとめに持っています。

たとえば、ゲームを作る場合を考えてみます。

ゲームには、プレイヤー・敵キャラクター・アイテム・武器・ステージなどの要素があります。

これらをそれぞれ1つの「部品」として考えて、部品ごとにデータと処理をまとめるのがオブジェクト指向のイメージです。

おしけん

「関連するデータと処理をひとかたまりにする」これがオブジェクト指向の基本的な発想です!

【C#】オブジェクト指向を理解するために必要な用語

C#のオブジェクト指向を理解するために、次の4つの用語を押さえましょう。

用語一言で言うと
クラスオブジェクトを作るための設計図
インスタンス設計図から作った実体
オブジェクトプログラムの中で扱うもの
メンバークラスの中に定義された変数やメソッド

特に「クラス」と「インスタンス」の違いでつまずく方がとても多いです。

悩んでる人

クラスとインスタンスって、何がどう違うの?

おしけん

「設計図」と「実際に作られたモノ」の違いです!車で例えると、クラスが「車の設計図」、インスタンスが「実際に走っている車」のイメージです!

クラスとインスタンスのイメージ

クラスとインスタンスの関係は、「設計図」と「実際に作られたモノ」の関係です。

車を例にすると、クラスが「車の設計図」、インスタンスが「実際の車」にあたります。

車の設計図があっても、設計図だけでは走ることができません。

設計図をもとに実際に車を製造して、はじめて走ることができます。

// クラス(設計図)の定義
class Car
{
    public string Name;
    public string Color;

    public void Run()
    {
        Console.WriteLine($"{Name}が走ります");
    }
}

// インスタンス(実体)の作成
Car car = new Car();
car.Name = "プリウス";
car.Color = "白";
car.Run(); // プリウスが走ります

1つのクラスから複数のインスタンスを作れるのがポイントです。

「プリウス」「クラウン」「カローラ」など、同じ設計図からそれぞれ独立したオブジェクトを何個でも作成できます。

おしけん

クラスとインスタンスの違いは、オブジェクト指向の第一歩です!ここをしっかり理解するだけで、その後の学習がグッとラクになりますよ!

【C#】オブジェクト指向を使うメリット

オブジェクト指向を使うメリットは、主に次の3つです。

オブジェクト指向のメリット
  • プログラムを整理しやすくなる:関連するデータと処理をクラスにまとめられる
  • 処理を再利用しやすくなる:1つのクラスから複数のインスタンスを作って使い回せる
  • 修正や変更に対応しやすくなる:修正箇所をクラス内に限定できる

メリット:プログラムを整理しやすくなる

関連するデータと処理をクラスにまとめることで、コードの見通しがよくなります。

たとえば、会員情報を管理するプログラムであれば、会員ID・名前・メールアドレス・年齢などのデータをバラバラの変数で管理するのではなく、Memberクラスとしてひとまとめにできます。

プログラムが大きくなっても、どこに何があるのかが一目で分かるようになります。

悩んでる人

バラバラに変数を作っても動くし、クラスにまとめる必要ってあるの?

おしけん

小さなプログラムでは分かりにくいですが、変数が100個・1000個と増えると一気に管理が大変になります!クラスにまとめておくと「会員の情報はMemberクラスを見ればいい」と一目瞭然になりますよ!

メリット:処理を再利用しやすくなる

1つのクラスを作っておけば、同じ設計図から何度でもインスタンスを作ることができます。

会員管理であれば、Memberクラスのインスタンスを人数分作るだけで、同じデータ構造・同じ処理が何人分でも使い回せます。毎回ゼロから変数や処理を書き直す必要がなくなるため、開発効率が大幅に上がります。

メリット:修正や変更に対応しやすくなる

オブジェクト指向を使うと、修正する場所をクラスの中に限定できます。

たとえば、会員情報の表示方法を変えたい場合、Memberクラスの中だけを修正すれば済みます。プログラム全体に処理が散らばっていると、修正箇所を探すだけでも一苦労です。

おしけん

プログラムは作って終わりではありません!あとから修正することも多いので、整理しやすい形で作ることが大切です!

オブジェクト指向の4つの基本原則

C#のオブジェクト指向には、次の4つの重要な考え方があります。

Microsoftの公式ドキュメントでも、この4つがC#のオブジェクト指向の基本原則として紹介されています。

原則一言で言うと
抽象化必要な情報だけに注目して整理すること
カプセル化データを外部から守り、安全に扱う仕組み
継承既存クラスの機能を引き継いで新しいクラスを作る仕組み
ポリモーフィズム同じ命令でも、クラスによって動きが変わる仕組み

それぞれの概要を紹介します。

原則1:抽象化とは?

抽象化とは、プログラムで扱うために必要な情報だけを取り出して整理することです。

実際の車にはエンジン・タイヤ・ブレーキ・ライト・ハンドルなど、無数の要素があります。

しかし、プログラムで「走る・止まる」だけを表現したいなら、すべての情報は必要ありません。

抽象化のイメージ

「名前・色・速度・走る・止まる」という必要最小限の情報だけをクラスとして定義する、これが抽象化です。プログラムの目的に合わせて「何を表現するか」を絞ることで、シンプルで分かりやすいコードが書けるようになります。

おしけん

抽象化は「余計なものを削ぎ落とす」作業です。最初から完璧にやろうとするより、まず動くものを作りながら少しずつ整理していく感覚で大丈夫ですよ!

原則2:カプセル化とは?

カプセル化とは、データを外部から直接変更されないようにして、安全に扱う考え方です。

たとえば、銀行口座の残高をprivateにしておけば、外部から直接マイナスの値を入れることができなくなります。

入金・出金は専用メソッドを通じてのみ行えるようにすることで、不正な操作やバグを防ぐことができます。

なぜカプセル化が必要?

外部から自由にデータを変更できると「残高にマイナス値が入る」「ありえない値がセットされる」といったバグが発生しやすくなります。カプセル化はデータに鍵をかけて守るイメージです。プロの現場では、むやみにpublicを使わず、必要な部分だけを外部に公開するのが基本的なマナーです。

おしけん

カプセル化を使うと「おかしな値が外から直接入れられる」というバグを防げます!

👉 【C#】カプセル化とは?アクセス修飾子の使い方を徹底解説(個別記事リンク)

原則3:継承とは?

継承とは、既存のクラスをもとに新しいクラスを作る仕組みです。

共通する処理を親クラスにまとめて、子クラスでそれを引き継ぐことができます。

class Animal
{
    public string Name;
    public void Eat() { Console.WriteLine($"{Name}がごはんを食べます"); }
}

// DogはAnimalを継承。Eatメソッドをそのまま使える
class Dog : Animal
{
    public void Bark() { Console.WriteLine($"{Name}が吠えます"); }
}
おしけん

継承は「親の財産を引き継ぐ」イメージです!共通する処理を何度も書かなくてよくなるので、コードの量が減って管理もしやすくなりますよ!

👉 【C#】継承の書き方・使い方をサンプルで徹底解説(個別記事リンク)

原則4:ポリモーフィズム

ポリモーフィズムとは、同じメソッド名でも、クラスによって実行される処理が変わる仕組みです。

virtualoverride を使って、子クラスごとに処理を上書きできます。

class Animal  { public virtual void Speak() { Console.WriteLine("鳴きます"); } }
class Dog : Animal { public override void Speak() { Console.WriteLine("ワン!"); } }
class Cat : Animal { public override void Speak() { Console.WriteLine("ニャー!"); } }
ポリモーフィズムとは?

同じSpeak()という命令を出しているだけで、それぞれのクラスに応じた処理が自動的に実行されます。プログラムに後から新しい動物クラスを追加しても、既存のコードを変更せずに対応できるのが大きな強みです。

おしけん

「同じ命令でも、相手によって動きが変わる」仕組みです!最初は難しく感じるかもしれませんが、継承を理解したあとに学ぶとスムーズに理解できますよ!

👉 【C#】ポリモーフィズムとは?virtual・overrideの使い方を解説(個別記事リンク)

C#のオブジェクト指向を学ぶ順番

オブジェクト指向は、次の順番で学ぶのがおすすめです。

いきなり継承やポリモーフィズムから入ると難しく感じやすいので、基礎からひとつずつ積み上げていきましょう。

STEP

クラスとインスタンスを理解する

すべての土台になる概念。ここを飛ばすと後で必ずつまずきます。

STEP
プロパティとメソッドを理解する

毎日使う基本操作。早い段階でしっかり慣れておくことが大切です。

STEP
コンストラクターを理解する

インスタンス生成時に初期値を設定できる仕組み。現場でも必須の知識です。

STEP
カプセル化を理解する

データを安全に守る仕組み。アクセス修飾子(public/private)の使い分けを覚えましょう。

STEP
継承を理解する

コードの再利用を実現する仕組み。基礎が固まっていれば自然と理解できます。

STEP
ポリモーフィズムを理解する

継承の次に学ぶことで、virtual/overrideの使い分けが整理しやすくなります。

STEP
インターフェースを理解する

最後に学ぶことで、継承との違いや使い分けが整理しやすくなります。

おしけん

最初から完璧に理解しなくても大丈夫です!まずはクラスを作って、インスタンスを作成して、メソッドを呼び出す流れに慣れることが大切です!

C#のオブジェクト指向でよくある疑問

クラスとオブジェクトの違いは?

悩んでる人

クラスとオブジェクトって、結局何が違うの?

おしけん

クラスはオブジェクトを作るための設計図、オブジェクトはクラスをもとに作られた実体です。車で例えると「設計図 = クラス」「実際の車 = オブジェクト」のイメージです!

設計図だけでは走れないように、クラスを定義しただけではプログラムの中で使うことができません。

newキーワードでインスタンス(オブジェクト)を作ることで、はじめてデータを持ち、メソッドを呼び出せるようになります。

インスタンスとオブジェクトの違いは?

悩んでる人

インスタンスとオブジェクトって、どっちも同じじゃないの?

おしけん

初心者のうちはほぼ同じ意味として理解して大丈夫です!厳密な使い分けは、基礎に慣れてから意識しましょう!

厳密な使い分け(参考)
  • インスタンス:クラスから作成されたことを強調した言葉
  • オブジェクト:プログラムの中で扱うものとして見た言葉

参考書や記事によって使い方が異なることもあるので、どちらの言葉が出てきても「クラスから作った実体のことだな」と理解できれば問題ありません。

初心者はどこまで理解すればいい?

悩んでる人

オブジェクト指向って覚えることが多すぎる

悩んでる人

最初は何を理解すればいいんだろう?

まずは次の5つを理解できれば十分です。

 初心者がまず覚えること
  • クラスは設計図
  • インスタンスは実体
  • プロパティはデータを持つもの
  • メソッドは処理を行うもの
  • new でインスタンスを作る

継承やポリモーフィズムは、基礎に慣れてから少しずつ学んでいきましょう。

まとめ

本記事では、C#のオブジェクト指向の全体像について解説しました。

重要なポイントをまとめると、次のとおりです。

  • C#はオブジェクト指向をベースにしたプログラミング言語
  • クラスは設計図、インスタンスはその実体
  • オブジェクト指向の4大原則は「抽象化・カプセル化・継承・ポリモーフィズム」
  • 学ぶ順番はクラス → プロパティ → コンストラクター → カプセル化 → 継承 → ポリモーフィズム

オブジェクト指向は、最初から完璧に理解しようとすると難しく感じます。

まずはクラスを作成してインスタンスを生成し、メソッドを呼び出すという基本の流れを体で覚えることが大切です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次