はじめに
クラスは奥が深いので、何記事かにわけて解説していこうと思っています。
この記事では、一番簡単なクラスの作成方法を説明します。
- クラスの作成方法
- クラスとオブジェクト (インスタンス) の違い
- クラスを作成したい方
- オブジェクト指向に興味のある方
クラスとは?
クラスとは一般的に、「オブジェクトを作成するための設計図」と表現されることが多いです。
具体的な例がないと、ちょっとわかりにくいかもしれません。
例えば、簡単なRPGを作りたいとします。
最低限必要な要素として
- 主人公
- モブ敵
- ボス
あたりが挙げられるでしょうか。
この中で、モブ敵は何体も出現しますが、どのモブ敵も「固有名 (モブA、モブB など)」と「相手を状態異常にできる」という能力を持っているとしましょう。
ただ、状態異常にできる種類 (やけど、どく、まひ など) はモブ敵により異なります。
この場合、モブ敵であれば「固有名」「状態異常」の2つは必ず必要な要素となりますので、
「モブ敵は、固有名を持っていて、状態異常を使える」
という情報が記載された設計書 (テキストファイルとかだとイメージしやすいかも) を作っておき、実際にモブ敵を作成する際にはその設計書をコピーして作成すると簡単そうです。
このようにクラスとは、物体 (今回だとモブ敵) を成立させるために必要な情報がまとめられた設計書のようなもの になります。
クラスとオブジェクト (インスタンス)
クラスについて触れていくと、オブジェクト や インスタンス という言葉を目にすることがあるかと思います。
これらは何が違うのでしょうか?
まず、クラスについては設計書のようなものだと説明しました。
それに対して、オブジェクトは その設計書の実体 と表現することができます。
また、オブジェクトは別名インスタンスとも言い、どちらを使用しても一般的に問題ありません。
「設計書の実体」と言われてもピンとこないと思うので、具体例を出しましょう。
先ほどのRPGを例に出すと、「モブ敵」という設計書がクラスに該当し、実際にゲームに登場する「モブA」「モブB」が設計書の実体、オブジェクトに該当します。
私たち人間で表現すると、私こうちゃや、この記事を読んでくださっているみなさんはオブジェクトに該当します。
そして我々の根幹である「人間」という概念がクラスに該当します。
上記の例だとイメージわきにくいかもしれませんが、
- クラス:実体が存在しない概念のようなもの
- オブジェクト:実際に存在するもの(我々はこの世界に存在していて、モブA、モブBはゲームの中で存在する)
という違いがあります。
クラスの作り方
まず、以下のコードを見ていきましょう。
namespace Characters
{
class Mob
{
public string name; // 固有名
public string status; // 状態異常
}
}
このコードは、「Mob」というクラスを定義・実装しているコードになります。
上記のように
class クラス名
{
実装
}
と記述することでクラスを作成することができます。
次に、「Mob」クラス内に実装されている以下のコードを見ていきましょう。
public string name;
public string status;
これらのように、クラス内に実装されている変数を メンバ変数 と言います。
今回は実装していませんが、クラスの中に実装されているメソッド (関数) を メンバメソッド (関数) と言います。
これらの用語はクラスを使用するとよく出てくるので覚えておくとよいでしょう。
さて、内容に移りますが、先頭に書いてある「public」を アクセス修飾子 と言います。
ここでは簡単に3つだけ紹介します。
- public:すべてのプロジェクトから使用・参照可能
- protected:自クラス及び、自クラスを継承しているクラスからのみ使用・参照可能
- private:自クラスからのみ使用・参照可能
他にもいくつかありますが、上記3つはほんとうによく使うので覚えておきましょう。
protectedで「継承」というワードが出ていますが、別記事で紹介しますので今回は見流してください。
今回、「name」も「status」もアクセス修飾子は「public」なので、どこからでも使用・参照可能になります。
上記のように、メンバ変数は以下の形で定義します。
アクセス修飾子 型 変数名;
メンバ関数も紹介したいところですが、今回は入門編なので、また別記事で紹介しようと思います。
クラスの使い方
それでは、クラスの使い方について見ていきます。
using Characters;
namespace Main
{
class Program
{
static void Main(string[] args)
{
// オブジェクトの作成
Mob mobA = new Mob();
Mob mobB = new Mob();
// Mobクラスのメンバ変数「name」を設定
mobA.name = "モブA";
mobB.name = "モブB";
// Mobクラスのメンバ変数「status」を設定
mobA.status = "どく";
mobB.status = "まひ";
// メンバ変数「name」出力
Console.WriteLine($"mobA.name = {mobA.name}");
Console.WriteLine($"mobB.name = {mobB.name}");
// メンバ変数「status」出力
Console.WriteLine($"mobA.status = {mobA.status}");
Console.WriteLine($"mobB.status = {mobB.status}");
}
}
}
上記のコードは、「Mob」クラスを使用しているコードになります。
上から見ていきましょう。
// オブジェクトの作成
Mob mobA = new Mob();
Mob mobB = new Mob();
この部分で「Mob」というクラスのオブジェクト「mobA」「mobB」を作成します。
これを オブジェクト化 や インスタンス化 と言ったりします。
このようにインスタンス化することで、設計図でしかなかった「Mob」クラスの機能を持ったオブジェクトが誕生します。
// Mobクラスのメンバ変数「name」を設定
mobA.name = "モブA";
mobB.name = "モブB";
続いて、「mobA」「mobB」それぞれに固有名を付ける必要があります。
「Mob」クラスのメンバ変数「name」は、アクセス修飾子を「public」にしているため、クラス外から直接指定して設定することができます。
「mobA」には”モブA”、「mobB」には”モブB”と名付けました。
このように、「mobA」と「mobB」はまったく別のオブジェクトになるので、それぞれ別の情報を持つことができます。
// Mobクラスのメンバ変数「status」を設定
mobA.status = "どく";
mobB.status = "まひ";
「name」と同様に、メンバ変数である「status」にも「mobA」と「mobB」で別の情報を入れていきましょう。
こうすることで、
- mobA:固有名 = モブA、状態異常 = どく
- mobB:固有名 = モブB、状態異常 = まひ
と、それぞれ異なる情報を持たせることができました。
// メンバ変数「name」出力
Console.WriteLine($"mobA.name = {mobA.name}");
Console.WriteLine($"mobB.name = {mobB.name}");
// メンバ変数「status」出力
Console.WriteLine($"mobA.status = {mobA.status}");
Console.WriteLine($"mobB.status = {mobB.status}");
最後に、上記のコードで「mobA」と「mobB」にそれぞれ設定した情報がちゃんと保持されているかを確認していきましょう。
実行結果
上記のコードを実行すると、結果は以下のようになります。
mobA.name = モブA
mobB.name = モブB
mobA.status = どく
mobB.status = まひ
「mobA」と「mobB」、それぞれ設定した情報がしっかりと保持されていることがわかります。
このように、1つのクラスから複数のオブジェクトを作成し、それぞれのオブジェクトに異なる情報を持たせることができました。
さいごに
今回は、クラスの使い方の入門編ということで、
- クラスの作り方
- メンバ変数の実装・扱い
について説明しました。
今回紹介した内容は超入門編で、クラスはほんとうに奥が深いものになります。
今回紹介できなかったメンバ関数をはじめ、いろいろな要素を持っており、それらをどう組み合わせてクラスを作成していくか、とても悩みポイントです。(笑)
難しい内容ですが、その分扱うのがとても楽しいですので、この先もクラスについて記事を書いていきたいと思っています。
何回かに分けての紹介になりますが、クラスに興味がある方は是非目を通していってください!
今回はここまで♪
楽しいプログラミングライフを!