「OOP」クラス・関数・モジュールの違いと主要概念のまとめ

OOPを理解する為に必要な，基本的な用語や考え方を簡単に纏めた．

---

### クラス・関数・モジュールの違い

クラス (Class)
- 役割: データと、そのデータを扱うメソッド（関数）をまとめて表現するための設計図である.
イメージ: 「自動車の設計図」を思い浮かべるとよい. どんな情報（色や馬力など）とどんな処理（走る、止まるなど）を持つのかをまとめておくものである.

- 関数 (Function / メソッド)
役割: ある一連の処理をひとまとまりにするものである. 「メソッド」は、クラス内に定義された関数のことを指す.
イメージ: 「エンジンをかける手順」をひとつのまとまりにしたもの. 何らかの処理をまとめてわかりやすくする.

- モジュール (Module)
役割: ある目的や分野に関連するクラスや関数をまとめて管理するための単位である. プログラムをファイルやパッケージ単位で整理するイメージである.
イメージ: 「工場を部品ごとに作業場でまとめる」ようなもの. 「エンジン関連」「ブレーキ関連」というようにファイルやパッケージとして分けておく.

クラス: オブジェクト（データ＋処理）をつくる“設計図”
関数: 処理をひとまとめにしたもの
モジュール: クラスや関数を関連ごとにグルーピングして管理する仕組み

---

### OOPの主要な用語

#### クラス (Class)
説明: データとメソッドをひとつにまとめた設計図である.
役割: どんなプロパティ（例: 名前, 年齢, HPなど）やメソッド（例: 攻撃する, レベルアップするなど）を持つか定義する.
例え: 「車の設計図」や「ゲームキャラクターの設計図」のようなイメージ.

#### スーパークラス (Superclass) / 親クラス (Parent Class)
説明: 継承の際に、機能や特性を子クラスが引き継ぐ元となるクラスである.
役割: 基本的な機能やデータを共通化する土台となる.
例え: 「乗り物」というスーパークラスを作り、「車」や「バイク」がそれを継承するという構図.

#### 委譲 (Delegation)
説明: あるオブジェクトが受け取った処理を、別のオブジェクトに実際の処理を任せることである.
役割: 自分が直接やるのではなく、専門家（専用のクラスやオブジェクト）に仕事を委ねる仕組みである.
例え: 「秘書に雑用を頼む」「エンジンの制御はエンジン専用クラスに任せる」など.

#### 継承 (Inheritance)
説明: スーパークラス（親クラス）が持つ属性やメソッドを、サブクラス（子クラス）が引き継ぐ仕組みである.
役割: 共通部分をスーパークラスにまとめることで重複コードを減らす.
例え: 「車」というクラスから「スポーツカー」や「電気自動車」が継承して共通機能を使いつつ、独自機能を追加する.

#### コンポジション (Composition)
説明: クラス間の関係性であり、あるクラスが部品として他のオブジェクトを所有し、機能を組み合わせることである.
役割: パーツを組み合わせることで柔軟に設計できる.
例え: 「車クラス」の中に「エンジンオブジェクト」や「タイヤオブジェクト」を持つ構成.

#### コンストラクタ (Constructor)
説明: クラスからインスタンスが生成されるときに初期化処理を行うメソッドである.
役割: インスタンスの初期状態を設定する.
例え: 「家を建てるときに最初に行う基礎工事」のような役割.

#### インスタンス (Instance)
説明: クラスという設計図を基に実際に作られたオブジェクトである.
役割: メモリ上に用意された具体的なデータとメソッドの集合として実際に使われる.
例え: 「車の設計図（クラス）から製造された1台の車」がインスタンスである.


---
### OOPで難しいとされる用語・概念
#### ポリモーフィズム (Polymorphism)
説明: 同じメソッド名でも、呼び出す対象のクラスによって実装が異なる仕組みである.
役割: 統一的なインターフェースで呼び出しても、クラスごとに異なる処理が走る.
例え: draw()が「円オブジェクト」なら円を描画、「四角オブジェクト」なら四角を描画するようなもの.

#### カプセル化 (Encapsulation)
説明: オブジェクトの内部状態や処理を外部から直接触れないようにし、必要なインターフェースだけを公開することである.
役割: データの保護や実装変更の柔軟性を高める.
例え: 「テレビのリモコン」で外部からはボタンだけ押せるが、中の仕組みは直接触れない構造.

#### インターフェース (Interface)
説明: メソッドやプロパティの形だけを定義し、実装は書かないための仕組みである.
役割: 異なるクラスでも同じインターフェースを実装していれば、同じ方法で呼び出せる.
例え: コンセントとプラグの関係. 形（規格）が同じならどんな家電でも使える.

#### 抽象クラス (Abstract Class)
説明: インスタンスを直接作れないクラスであり、一部のメソッドは実装されずにサブクラスでの具体的実装を必須にする.
役割: サブクラスに「必ずこのメソッドを実装せよ」と命令する枠組みを与える.
例え: 「抽象的な乗り物クラス（アクセルやブレーキのメソッドを宣言だけ）」を置き、具体的に車やバイクで実装する.

#### オーバーライド (Override) / オーバーロード (Overload)
オーバーライド: スーパークラス（親）で定義されたメソッドの実装を、サブクラス（子）で上書きすることである.
オーバーロード: 同じメソッド名でも、引数の数や型が違えば複数定義できる仕組みである.

---

### まとめ
OOPの主な概念を以下に整理する.

クラスはオブジェクトを作る設計図である.
インスタンスはクラスから実際に生成されたもの.
継承は共通部分の再利用を容易にし、コード重複を減らす.
コンポジションは部品を組み合わせて機能を作る.
委譲は自分ではなく、専門のオブジェクトに処理を任せる.
ポリモーフィズムやカプセル化はOOPを強力な手法たらしめる中核要素である.
実際に手を動かしながら小さなプログラムを書き、継承やコンポジションを使い、メソッドを委譲するなどしてみると理解が深まる. コードを書きながら慣れていくことがOOP学習の近道である.


---

### 参考文献
- Java Tutorials - Object-Oriented Programming Concepts
[https://docs.oracle.com/javase/tutorial/java/concepts/](https://docs.oracle.com/javase/tutorial/java/concepts/) (最終閲覧日:2025/02/18)

- Ruby ドキュメント - クラスとオブジェクト
[https://docs.ruby-lang.org/ja/latest/class/Object.html](https://docs.ruby-lang.org/ja/latest/class/Object.html)(最終閲覧日:2025/02/18)

- C++ Documentation - Classes 
[https://en.cppreference.com/w/cpp/language/classes](https://en.cppreference.com/w/cpp/language/classes)(最終閲覧日:2025/02/18)