オブジェクト指向入門 ⑤構造体の使い方とクラス

オブジェクト指向入門

引き続き、「オブジェクト指向の使い方」の話をしていきます。

オブジェクト指向の使い方とは、
言い換えるとクラスの使い方ということになります。

そんでもって、クラスの使い方は様々であり、
何かしらの処理(メソッド)を持つものを使うこともあります。

※何かしらの処理(メソッド)を持つクラスのイメージ

しかしながら、中にはメソッドを持たないものを使うこともあります。

メソッドを持たないということは、プロパティしか持っていないということであり、
つまり、変数のように値を入れる箱しか持っていないということです。

例えるなら、区分けのある「収納用品」や「小物入れ」みたいなものと言っても良いでしょう。

※何かしらの処理(メソッド)を持たないクラスのイメージ

こうした小物入れみたいなものもかなり便利で、プログラミングでしょっちゅう使うので、
それについて説明していきます。

「構造体」の話

ここで、「構造体」の話をしておきましょう。
プログラミングにおける構造体とは、
「いろんな情報を一つのかたまりにしたもの」です。

例えば、「商品情報」というのを扱いたくて、
一つの商品につき以下の情報を持たせたい場合、
それ専用の構造体が必要になります。

  • 商品番号
  • 商品名
  • 商品の値段
  • 商品の種別
  • 製造会社

実際には「商品の原価」とか「軽減税率適応か否か」とか、
「大分類」「中分類」「小分類」とか、
様々なものが必要でしょうけど、これは簡易的な例ということにして・・・

もしも「商品管理のシステムを作りたい」となった場合、
以上のような構造体を用意しておくことが必須になるわけです。

他にも、店舗情報、会社情報、社員情報・・・など、
情報を整理して扱いたい場合、様々な局面で構造体が必要になります。

それから、ゲームとかでも構造体が必須です。

任天堂の某有名ゲームを引用すると・・・
例えば、ポケモンの強さだったら以下のパラメーターを持ってたりするわけです。

  • ポケモンの番号
  • ポケモンの名前
  • HP
  • 攻撃力
  • 防御力
  • 特殊攻撃力
  • 特殊防御力
  • すばやさ

※俗に言う「種族値」と呼ばれるもの

さらに「覚える技」も追加しましょうか・・・

「覚える技」の情報を入れるには、
そもそも「覚えるレベル, 覚える技」の組み合わせが必要なので、
以下の構造体を用意する必要があります。

  • 覚えるレベル
  • 覚える技

そんでもって、こういう情報は一つのポケモンにつき複数必要なので、
配列やリストの形式でこの情報を持ちます。

合わせると、ポケモン一匹につき以下の情報がいるので、そういう構造体を作っておきます。

  • ポケモンの番号
  • ポケモンの名前
  • HP
  • 攻撃力
  • 防御力
  • 特殊攻撃力
  • 特殊防御力
  • すばやさ
  • ポケモンの覚える技とレベルの構造体(リスト形式で複数持つ)

他にも必要な情報を考え出すとキリがないのでこの辺にしておくとして・・・

ここで強調したいのが「構造体の中に構造体がある」って仕組みになっていることです。

こういうケースはシステム開発をやっててザラにあるので、
そういうのも頭で処理できるようにしていきましょう。
さらには、「構造体の中に構造体の中に構造体がある」ぐらいのこともあります。

構造体をクラスで定義する

さて、ここまでは「構造体」の話をしました。

そして、オブジェクト指向においては、
構造体を作るのに「クラス」がそのまま使えます。

例えば、「商品情報」の構造体を定義したい場合、
クラスを使って以下の通りに書いていきます。
(C#の場合)

class ItemInfo
{
    //商品番号
    int itemNo;

    //商品名
    string itemName;

    //商品の値段
    int itemPrice;

    //商品の種別
    string itemType;

    //製造会社
    string company;
}

そんでもって、クラス自体は「入れ物の設計図」みたいなもので、
「new Item()」とインスタンス化すると入れ物が実際にできる、みたいなイメージです。

これもまたオブジェクト指向の使い方として重要で、
とても便利なのでよく使われます。

リストや配列+構造体

先ほどは「商品情報」を実際に書く場合についてをやりました。

「ポケモンの強さ情報」の場合は以下のように書きます。
(C#の場合)

class PokemonStrength
{
    //ポケモンの番号
    int no;

    //ポケモンの名前
    string name;

    //HP
    string HP;

    //攻撃力
    int atack;

    //防御力
    int defense;

    //特殊攻撃力
    int specialAttack;

    //特殊防御力
    int specialDefense;

    //すばやさ
    int speed;

    //ポケモンの覚える技とレベルの構造体(リスト形式で複数持つ)
    List<SkillLevelInfo> skillLevelInfo;

}

class SkillLevelInfo
{
    //覚えるレベル
    int level;

    //技名称
    string skillName;
}

「覚える技とレベル」用のクラス「SkillLevelInfo」も使いつつ、
リストを使っている所がポイントです。
(C#やJavaだとリストがよく使われます。)

配列の場合だと「SkillLevelInfo[]」と書きます。
こっちで実装することも可能ですが、
C#やJavaだとリストの方が使いやすいのでリストが好まれます。

以上のように、「リスト+構造体」を併用して使うことは多いです。

「リスト+構造体」を使うイメージは以下のようになります。

これはめちゃくちゃよく使うので覚えておきましょう。

「縦×横」で情報を持っているので、二次元配列の形にも近いっちゃ近いです。

ただ、構造体を使った方が横軸の項目に入れるものが明確なので、
そっちがよく使われます。

配列でもできなくはない話

ちなみにちょっと考えてみましょう。
「構造体を作らずとも、配列でなんとかなるのでは?」

例えば、商品情報で「商品番号」「商品名」「商品の値段」「商品の種別」「製造会社」
あたりの項目を管理したい場合、
全部で5つある配列を用意しましょう。

そんでもって約束事として、
配列の0番に商品番号、1番に商品名、2番に商品の値段・・・
と入れるようにして値を管理していきましょう。

なかなか無理のあるやり方になりますが・・・
情報の格納はできるので、簡易的なものだったらこれでも良いのかもしれません。

しかしながら、配列の場合は「一律で数値」とか「一律で文字列」といった情報しか格納できないし、
先ほどのポケモンの強さ情報の時みたいに、
「ポケモンが覚える技とレベルの情報リスト」を入れたいみたいに複雑化していくと、
一次元配列や二次元配列では無理になってきます。

以上のように、「配列」や「二次元配列」でもある程度の情報管理はできますが、
より複雑な構造の情報を入れたい場合は「構造体」が必須で、
構造体を作るのにクラスがそのまま使えるという話でした。
 

まとめ
  • 「構造体」は「いろんな情報を一つのかたまりにしたもの」。
    例えば、商品情報の場合は
    「商品番号」「商品名」「商品の値段」「商品の種別」「製造会社」など
  • クラスを使って構造体を作ることができる
  • 構造体の中に構造体があることもある
  • 「リスト+構造体」はよく使われる

 

オブジェクト指向入門 ⑥「クラス」と「型」の関係について理解する
さて、今回は「クラス」と「型」の関係についてを説明していきます。 型についてのおさらい まず、「型」とは何だったでしょうか? これは『プログラミング入門 ③「変数」について理解する』の項で説明しました。 おさらいしておくと、変数に入...

コメント