オブジェクト指向のオブジェクト・クラス・メソッドとは

## はじめに
改めて聞かれた時に、自分の言葉で説明できず、理解が浅いことに気づいたので、個人的なメモとして残しておこうと思います。今回は、ピクミンを例えに使ってオブジェクト指向を理解していきたいと思います。
誤り等ありましたら、ご指摘いただけると幸いです。

### 1. オブジェクト指向（OOP: Object Oriented Programming)とは
プログラミングの考え方の一つです。**属性（データ）とメソッド（処理手順**)を「**オブジェクト**」というまとまりとして捉え、それを組み合わせてシステムを構築する考え方です。
ピクミンの世界で言うと「キャラクター（ピクミン）に役割や特徴を持たせて、その役割を使ってゲームを進める」ような考え方です。

---
### **オブジェクト**
- **データ（属性）**：ピクミンの「特徴」「色」「形」などの情報
  例：赤ピクミンの属性は「色は赤」「炎に強い」という特徴です。
  
- **メソッド（処理手順）**：ピクミンが実際に行う「行動」や「能力」。  
  例：赤ピクミンが敵と戦ったり、青ピクミンが水中を移動するという動作がメソッドです。
---

### 2. 具体例：赤ピクミンと青ピクミンの作成

#### クラス定義（設計図）
まず、ピクミンの種類ごとに「クラス」という設計図を作ります。この設計図には、そのピクミンが持っている特徴（色や能力）と、ピクミンができること（岩を壊す、炎に強いなど）が含まれています。

例えば、「赤ピクミン」と「青ピクミン」をクラスとして作成します。

```java
// 赤ピクミンのクラス
class RedPikmin {
    String color = "赤";  // 赤ピクミンの色
    String ability = "炎に強い";  // 炎に強いという特徴

    void fight() {
        // 敵と戦う機能
        System.out.println("赤ピクミンが戦っている！");
    }
}

// 青ピクミンのクラス
class BluePikmin {
    String color = "青";  // 青ピクミンの色
    String ability = "水中でも生きられる";  // 水中で生きられる特徴

    void swim() {
        // 水の中を移動する機能
        System.out.println("青ピクミンが水中を移動している！");
    }
}
```

#### オブジェクト（実際のピクミン）
クラスが設計図なら、それを元に作られる「実際のピクミン」がオブジェクトです。例えば、ゲームで「赤ピクミン」や「青ピクミン」を召喚します。

```java
public class Main {
    public static void main(String[] args) {
        // 赤ピクミンのオブジェクトを作成
        RedPikmin redPikmin1 = new RedPikmin();
        redPikmin1.fight();  // 赤ピクミンが戦う

        // 青ピクミンのオブジェクトを作成
        BluePikmin bluePikmin1 = new BluePikmin();
        bluePikmin1.swim();  // 青ピクミンが水中を移動
    }
}
```

この例では、「RedPikmin（赤ピクミン）」と「BluePikmin（青ピクミン）」というクラスから、それぞれのピクミンを作り、それぞれに役割を与えて行動させています。

### 3. ピクミンの役割とオブジェクト指向の関係
ピクミンには、赤ピクミン、青ピクミン、黄ピクミンなど、それぞれが異なる特徴や能力を持っています。オブジェクト指向も同様で、クラスを使ってそれぞれのキャラクターに特徴（色、能力）を与え、オブジェクトとして実際にゲームの中で行動させます。

- **クラス（設計図）**：ピクミンの種類ごとの特徴や能力（赤ピクミンは炎に強い、青ピクミンは水に強い）。
- **オブジェクト（実際のピクミン）**：クラスから作られる「具体的なピクミン」。それぞれのピクミンが異なる役割を持っている。
- **メソッド（できること）**：ピクミンの行動（戦う、水中を移動する、岩を壊すなど）。

### 4. まとめ
オブジェクト指向は、ピクミンの世界のように、異なる能力を持つキャラクター（オブジェクト）を使って、問題を解決するプログラムを作る考え方です。ゲームの中でピクミンに役割を与えて行動させるように、オブジェクト指向では、プログラム内で役割を持ったオブジェクトを作り、それぞれに適した動作をさせて問題を解決していきます。

最後まで読んでいただきまして、ありがとうございました！


## 追記
インターフェイスを使用して、ピクミンに共通する動作を追加

### 具体例：赤ピクミンと青ピクミンの作成

#### インターフェース定義（共通のルール）
すべてのピクミンに共通する動き（例えば、走る、集合するなど）を**インターフェース**として定義します。

```java
// ピクミンのインターフェース
interface Pikmin {
    String getColor();  // ピクミンの色を取得
    String getAbility();  // ピクミンの能力を取得
    void move();  // ピクミンを移動させる
    void gather();  // ピクミンを集合させる
}
```

#### クラス定義（設計図）
次に、赤ピクミンと青ピクミンの特徴をそれぞれのクラスで定義し、**Pikminインターフェース**を使って共通の動作を持たせます。

```java
// 赤ピクミンのクラス
class RedPikmin implements Pikmin {
    private String color = "赤";  // 赤ピクミンの色
    private String ability = "炎に強い";  // 炎に強いという特徴

    @Override
    public String getColor() {
        return color;
    }

    @Override
    public String getAbility() {
        return ability;
    }

    @Override
    public void move() {
        System.out.println("赤ピクミンが走っている！");
    }

    @Override
    public void gather() {
        System.out.println("赤ピクミンが集合している！");
    }

    public void fight() {
        System.out.println("赤ピクミンが戦っている！");
    }
}

// 青ピクミンのクラス
class BluePikmin implements Pikmin {
    private String color = "青";  // 青ピクミンの色
    private String ability = "水中でも生きられる";  // 水中で生きられる特徴

    @Override
    public String getColor() {
        return color;
    }

    @Override
    public String getAbility() {
        return ability;
    }

    @Override
    public void move() {
        System.out.println("青ピクミンが走っている！");
    }

    @Override
    public void gather() {
        System.out.println("青ピクミンが集合している！");
    }

    public void swim() {
        System.out.println("青ピクミンが水中を移動している！");
    }
}
```

#### オブジェクト（実際のピクミン）
クラスが設計図なら、それを元に作られる「実際のピクミン」がオブジェクトです。インターフェースを使うことで、どの色のピクミンでも同じ命令で動かすことができます。

```java
public class Main {
    public static void main(String[] args) {
        // 赤ピクミンのオブジェクトを作成
        Pikmin redPikmin1 = new RedPikmin();
        redPikmin1.move();  // 赤ピクミンが移動する
        redPikmin1.gather();  // 赤ピクミンが集合する

        // 青ピクミンのオブジェクトを作成
        Pikmin bluePikmin1 = new BluePikmin();
        bluePikmin1.move();  // 青ピクミンが移動する
        bluePikmin1.gather();  // 青ピクミンが集合する
    }
}
```