009. クラス(構造体)の役割とは

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

オブジェクト指向プログラミングでは、クラスや構造体が出てきます。しかし、それは何のためにあるものなのかいまいちわかりにくいものがありますよね。

クラス(構造体)はメソッドや変数の定義

例えばゲーム等でとある敵がいます。
その敵は画面上に何体も出てくる者です。例えばマリオのクリボーと例えてみましょう。
あるクリボー1に対して必要なデータは何があるでしょう

  1. そのクリボーが存在する位置(座標)
  2. 何か特殊能力を持っている(デカクリボーとか)
  3. その敵の体力(マリオの場合一撃なので関係ないかも)

いろいろパターンはあり得ると思います。
画面上に存在するクリボーは1体とは限りませんし、制限がなければドカンから出てくるクリボーは無限に現れると思います。
しかし、これを管理しようとするとオブジェクト指向以外ではかなり煩雑になるのです。
例を見てみましょう。これはオブジェクト指向を利用しない場合の例です。ちょっと極端な書き方ですが

public void Main() {
    // クリボー1のデータ
    int kuribo1_HP = 10;
    int kuribo1_Effect = 0;
    int kuribo1_X = 30;
    int kuribo1_Y = 20;
    // クリボー2のデータ
    int kuribo2_HP = 10;
    int kuribo2_Effect = 0;
    int kuribo2_X = 35;
    int kuribo2_Y = 20;
    // クリボー3のデータ
    int kuribo3_HP = 10;
    int kuribo3_Effect = 0;
    int kuribo3_X = 40;
    int kuribo3_Y = 20;
    // 以下続く…
}

極端な例ですが、このように管理する必要があります。(普通は配列を作ってもう少しマシにしますが面倒なことに変わりないです。)
しかも、操作するクリボーによって扱いべき変数が変わります。面倒臭すぎませんか?

クラスとは定義

さて、クラスを使うとどのようになるのでしょうか。
例を見てみましょう。

public class Kuribo {
    public int X = 0;
    public int Y = 0;
    public int HP = 10;
    public int Effect = 0;
}
public void Main() {
    Kuribo k1 = new Kuribo();
    Kuribo k2 = new Kuribo();
    Kuribo k3 = new Kuribo();
    // 例えばクリボー1の座標を変えたい場合
    k1.X = 10;
}

このようにコンパクトにまとめることができます。
なおメモリの中ではこのようになっています。
d5
このようにまとまってメモリの中には格納されるのです。こうすることで綺麗なコードが書けますし、バグりにくいコードが書けるというわけです。

クラス内のメソッド

例えば、クラスの中にLevelという変数があり、LevelUpというメソッドがあるとします。
LevelUpとはLevelを1上げるメソッドとします。するとこのようなコードになりますね

public class Kuribo {
    public int X = 0;
    public int Y = 0;
    public int HP = 10;
    public int Level = 1;
    public int Effect = 0;
    public void LevelUp() {
        this.Level += 1; // Levelを1上げる
    }
}

クラス内のメソッドで、自分のオブジェクトのデータをいじる際はthisを元になるオブジェクトとして指定します。もちろん省略しても可能ですが、極力省略しないでください。
このクラスを利用したコードの例を見ましょう。

public void Main() {
    Kuribo a = new Kuribo();
    a.LevelUp();
    // a.Level => 2
}

クラス内のメソッドを利用する際は、元になるオブジェクトの後に.(ドット)をつけてからメソッドを指定します。