クラス・インスタンス・メソッドをポケモンで例えてみた【ビルドアップ】

しいたけが　しょうぶを　しかけてきた！

Qiitaは一応エンジニア向けのブログなので、ここで一つエンジニアっぽいブログを書きました。
プログラミング経験は一応あるのですが、3年もブランクがあると忘れてしまいました。
（1 2の……ポカン！という感じではなく、じわじわと忘れていった感じ）
なので思い出すためにも、ここに書き残します。

# コード
```pokemon.java
class Pokemon {
    private String name;
    private String type;
    private int level;

    public Pokemon(String name, String type, int level) {
        this.name = name;
        this.type = type;
        this.level = level;
    }

    public void attack() {
        System.out.println(name + "の攻撃！");
    }

    public void levelUp() {
        level++;
        System.out.println(name + "はレベル" + level + "に上がった！");
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

    public int getLevel() {
        return level;
    }

    public static void main(String[] args) {
        // ポケモンのインスタンスを作成
        Pokemon pikachu = new Pokemon("ピカチュウ", "電気", 5);
        Pokemon charmander = new Pokemon("ヒトカゲ", "炎", 8);

        // インスタンスの属性へのアクセス
        System.out.println(pikachu.getName());  // 出力: ピカチュウ
        System.out.println(charmander.getType());  // 出力: 炎

        // インスタンスのメソッド呼び出し
        pikachu.attack();  // 出力: ピカチュウの攻撃！
        charmander.levelUp();  // 出力: ヒトカゲはレベル9に上がった！
    }
}
```

# クラスとは？
**関連するデータと処理をひとまとまりにするための「設計図」やテンプレートのこと**です。クラス自体は抽象的な概念ですが、これに基づいて具体的なインスタンスを生成します。
今回でいえば、```Pokemon```がクラス名です。ふしぎなふしぎな生きものをひとまとまりにする役割を持っています。
```java
class Pokemon { }
```
この部分はクラスの宣言です。
ここに様々な情報、すなわち **属性（フィールド）** とメソッドを格納します。
```java
private String name;
private String type;
private int level;
```
これは```Pokemon```クラス の属性と呼び、「名前」「タイプ」「レベル」を保持します。
これらの属性は個々のポケモンが持つ情報を表現します。

### privateとは？
```java
private String name;
private String type;
private int level;
```
```private```はアクセス修飾子で、他のクラスから直接アクセスできないようにするためのものです。このおかげで、私たちはクラス内のメソッドを通じてのみ情報を管理・操作することができ、データが保護されます。

# インスタンスとは？
インスタンスは、**クラスの設計図をもとに実際に生成される具体的なオブジェクト**のことです。オブジェクトに対する動作や振る舞いを定義します。
具体的には、設計図をもとに作られた「もの」を指します。
インスタンスはクラスで定義された属性に基づいて、特定の値を持つ具体的な存在になります。
ポケモンなら「名前」では、ピカチュウ・イーブイ・ヒトカゲです。
「タイプ」では、でんき、ノーマル、ほのおです。
「レベル」は、5, 10, 100などです。

```java
// ポケモンのインスタンスを作成
Pokemon pikachu = new Pokemon("ピカチュウ", "電気", 5);
Pokemon charmander = new Pokemon("ヒトカゲ", "炎", 8);
```
ここで、```pikachu``` や ```charmander``` は ```Pokemon``` クラスの具体的なインスタンスです。これにより、設計図をもとに各ポケモンが「名前」、「タイプ」、「レベル」の属性を特定の値として持つようになります。
つまり、インスタンスは **クラスを「具現化」** したものです。

# メソッドとは？
**クラスに定義される関数であり、そのクラスのインスタンスに対して実行可能な操作や処理を記述する関数です。**
メソッドは、そのクラスのインスタンスが取ることのできる行動やタスクを表します。
分かりやすく言うと設計図をもとに作られたものの「動き」や「できること」を定義します。
```java
public void attack() {
    System.out.println(name + "の攻撃！");
}

public void levelUp() {
    level++;
    System.out.println(name + "はレベル" + level + "に上がった！");
}
```
この例では、```attack()```メソッドはポケモンが攻撃するときの動作を、```levelUp()```メソッドはポケモンがレベルアップするときの動作を記述しています。これらのメソッドは、すべての```Pokemon```インスタンス（例えば、ピカチュウやヒトカゲ）によって実行可能です。

つまり…？
ピカチュウは攻撃ができます。レベルを上げることもできます。
それはイーブイもヒトカゲも同様にできます。
つまり、「ポケモン」として定義されるすべてのものが同じ行動を実行できます。

# まとめ
**クラス　＝　設計図、テンプレート**
（例：ポケモン：「ポケモン名」「タイプ名」「レベル」といった特徴や動作をひとまとめにした設計）

**インスタンス　＝　設計図をもとに作られた具体的な「もの」**
（例：ポケモン名＝ピカチュウ、タイプ名＝でんき、レベル＝5）

**メソッド　＝　設計図をもとに作られたものの「動き」や「できること」**
（例：攻撃、レベルアップ：各インスタンスが持つ特定の機能や動作）

「ビルドアップ」
こうやってブログを書くというアウトプットをすることで、自分を強化していきたいですね。