はじめてのオブジェクト指向プログラミング~C#で学ぶOOPの基礎から実践まで~[限定]
はじめに
こんにちは。この記事では、プログラミング初心者でも理解できるように、オブジェクト指向プログラミング(OOP) についてやさしく、そして詳しく解説していきます。OOPは現代のソフトウェア開発ではとても大切な考え方で、ゲームやスマホアプリ、大規模なWebサービスなど、あらゆる場面で使われています。
「なんだか難しそう……」と思うかもしれませんが、安心してください。この記事ではできるだけ専門用語をかみ砕きつつ、具体的なイメージを持てるようにじっくり解説します。また、サンプルコードはC# という言語で示します。「C#なんて使ったことがない……」という方でも、クラスやメソッドなどOOPの概念を学ぶには分かりやすい構文になっているので、基礎勉強にぴったりです。ぜひ最後まで読んでみてください。
1. オブジェクト指向(OOP)とは?
1.1 プログラミングのいろいろなスタイル
プログラミングには、実はさまざまなスタイル(パラダイム)があります。たとえば、
- 手続き型: 処理を順番に書いていくやり方(C言語など)。
- 関数型: データを不変と考え、関数と入力→出力を重視するやり方(Haskellなど)。
- オブジェクト指向(OOP): もの(オブジェクト)を中心にデータと処理をひとまとめにして組み立てるやり方。
現代の大きなシステム開発では、オブジェクト指向が主流となっています。コードの再利用性や保守性を高めるのに適しているからです。
1.2 OOPが生まれた背景
「プログラムが複雑になると、いろんなところで同じようなデータを扱い、同じような処理をして、しかも管理するのが大変だ……」という状況が昔からありました。そこで「データと、それを操作する処理(メソッド)をひとまとめにして“モノ”として扱おう」という発想が生まれました。この「モノ」をオブジェクトと呼びます。私たちの日常生活でも、「自転車」というモノには「色」や「車輪の数」、「走る」といった特徴や動作がありますよね。そうした感覚でプログラムを組むのがオブジェクト指向です。
2. OOPの基本4要素
オブジェクト指向には、以下の5つの重要な概念があります。
- クラスとオブジェクト(インスタンス)
- カプセル化 (Encapsulation)
- 抽象化 (Abstraction)
- 継承 (Inheritance)
- ポリモーフィズム (Polymorphism)
2.1 クラスとオブジェクト(インスタンス)
クラスは、オブジェクトの「設計図」です。「犬」というクラスがあれば、そこには「名前」「年齢」「吠える動作」など犬に共通する性質が書かれています。
そして、クラスから具体的に作り出した実体をオブジェクト(インスタンス)と呼びます。「ポチ」という犬も「シロ」という犬も、同じ「犬」というクラスから生まれた別々の実体です。クラス=カテゴリ、オブジェクト=具体例、とイメージすると分かりやすいです。
2.2 カプセル化 (Encapsulation)
カプセル化とは、オブジェクトの内部(データや処理の実装)をなるべく隠して、外からは必要最小限の手段(メソッド)だけでアクセスするようにする考え方です。たとえば、銀行口座の残高を外部から勝手に書き換えられたら困りますよね。そこで「残高」をprivate(プライベート)に隠して、「お金を入金する」「残高を確認する」といったメソッドだけを公開する、という工夫をします。
2.3 抽象化 (Abstraction)
抽象化とは「本質的な要素だけに絞り込む」ことです。現実のものをプログラムに取り込むとき、すべての特徴を再現するとかえって複雑になります。そこで、必要な部分だけピックアップし、それ以外を省略します。たとえば「社員」クラスでは氏名やIDは重要でも、髪型や身長などは業務に関係ないなら省略します。要するに「このクラスはどんな責務(しごと)を持つの?」と考えて、不要な情報をカットするということです。
2.4 継承 (Inheritance)
継承は、すでにあるクラス(親クラス)の機能を受け継いで、新しいクラス(子クラス)を作る仕組みです。たとえば「動物」クラスを親として、犬クラスや鳥クラスを作るとします。犬や鷹は、動物の持つ共通の性質(名前、呼吸するなど)をそのまま利用でき、さらに「吠える」「飛ぶ」といった固有の振る舞いだけ追加すればOKです。これによりコードを無駄なく使い回せます。
2.5 ポリモーフィズム (Polymorphism)
ポリモーフィズムは「同じメソッドの呼び出しでも、実際にどのクラス(オブジェクト)なのかによって動作が変わる」性質です。たとえば、Animalクラスにあるspeak()メソッドを呼んだら、Dog型のオブジェクトなら「ワンワン!」、Cat型のオブジェクトなら「ニャー!」と出力されるようにできます。これによって「コードは共通インターフェースを呼び出すだけなのに、オブジェクトの種類ごとに振る舞いが変わる*という便利な仕組みが成り立ちます。
3. C#で学ぶOOP入門
3.1 C#とは?
C#(シーシャープ)は、マイクロソフトが開発したプログラミング言語です。Javaに似た文法構造を持ち、初心者が学ぶにも分かりやすいよう工夫されています。WindowsアプリやWebアプリだけでなく、Unityというゲームエンジンで使われる言語としても有名です。
3.2 はじめてのクラス定義
C#では、クラスは次のように定義します。とてもシンプルです。
public class Dog
{
// 名前(文字列)を入れておく変数(フィールド)を定義
public string Name;
// ここの中身がDogクラスの設計図になる
public void Bark()
{
Console.WriteLine($"{Name}が吠えた: ワンワン!");
}
}
public class Dog:Dogという名前のクラスを定義しています。publicはクラスを公開する(外部からアクセスできる)という意味です。- 中括弧
{ }の中にクラスの中身を書きます。ここに「どんなデータを持つか」「どんなメソッドがあるか」を書き込んでいきます。
3.3 フィールドとメソッド
上の例では、public string Name; という部分がフィールドと呼ばれる領域です。オブジェクトが持つデータ(プロパティ)を格納しておく場所だと思ってください。public void Bark() はメソッドで、オブジェクトが「実行できる動作(関数)」を表します。
3.4 コンストラクタ(Constructor)の役割
クラスを使ってオブジェクトを作るときに、最初に呼ばれる特別なメソッドがコンストラクタです。C#ではクラス名と同じ名前のメソッドがコンストラクタとして扱われます。
public class Dog
{
public string Name;
public int Age;
// コンストラクタ
public Dog(string name, int age)
{
Name = name;
Age = age;
}
public void Bark()
{
Console.WriteLine($"{Name}({Age}歳)が吠えた: ワンワン!");
}
}
これでnew Dog("ポチ", 3) のようにオブジェクトを生成すると、自動的に public Dog(string name, int age) の中身が呼び出され、Name と Age が初期化されます。
