クラスってなに? クラスの書き方が知りたい
メンバ変数やメンバ関数ってなに?
初期化ってどうやるの?
クラスは、オブジェクト指向を勉強するうえで欠かす事のできない要素です。C#も例外ではなく、クラスを使う事になります。
こんにちは、エンジニア歴5年の遠藤です。この記事では、C#におけるクラスの基礎知識について解説します。
本記事はこんな方へ向けて書かれています。
- クラスとは何か知りたい
- クラスに関連した基礎知識をおさえておきたい
- 具体的な使い方が知りたい
この記事はクラスに関する基礎の基礎となる部分について触れています。
ぜひ最後までお付き合いいただき、クラスの理解への第一歩を歩み出してください!
クラスとは
クラスは一般的にオブジェクトを作るための設計図のようなものと言われています。そのためオブジェクト指向の中心となる要素であり、理解を避けては通れない大切なものです。
後で詳しく解説しますが、クラスの中にはメンバ変数やメソッド(=メンバ関数)という物が定義され、そこに実体を持たせる事で処理されます。
以降ではその具体的な方法について紹介致します。
クラスの設計方法
それではまずクラスを書いてみましょう。
クラスの基本形は、以下になります。
using System; class クラス名{ //クラス名は任意。大文字から始まる。 //クラス内の処理を記述する }
上記のようにクラスは作成されます。クラス名は Sample{} のように、大文字から始めるようにしましょう。
メンバ変数について
クラスの中で宣言される変数をメンバ変数と言います。こちらはクラス内で有効な変数です。
例:
using System; class Sample{ int a = 1; string str = "test"; }
このようなSampleクラスがあるとき、”a”や”str”がメンバ変数となります。
メンバ関数について
メンバ変数同様、クラスの中で宣言されるメソッドをメンバ関数と呼びます。
例:
using System; class Sample{ public static void test1(){ // メソッド内の処理を記述 } }
このようにしてメソッドを宣言する事ができます。どのようにしてメソッドを呼び出す事ができるかについては、次の章で解説致します。
クラスとインスタンス
さて、ここまでクラスについて解説しましたが、上述の通りクラスはあくまで設計図です。そのため、利用する際には設計図を元にした実体を作る必要があります。
この実体をインスタンスと言います。
クラスからインスタンスを生成するには以下のように記述します。
クラス名 変数名; //インスタンスを格納する変数 変数 = new クラス名();
このように記述する事で、インスタンスを生成する事ができます。また、以下のように1行で記述することも可能です。
クラス名 変数名 = new クラス名();
インスタンスからメンバ変数、メンバ関数を利用する際は、以下のように記述します。
変数名.メンバ名
メンバ変数の場合は上記そのままの形で、メンバ関数の場合は最後に括弧を付けます。
まとめて解説してしまったので分かりにくかったかも知れませんが、サンプルコードを元に使い方を整理してみましょう。
サンプルコード:
using System; namespace SampleApplication { class Sample //クラス { int r; //メンバ変数 public void Circle() //メンバ関数 { double cir = 2 * 3.14 * r; Console.WriteLine("半径:" + r + ", 円周の長さ:" + cir); } public static void Main() { Sample cls = new Sample(); //1行の形でインスタンスを生成 cls.r = 4; //メンバ変数に値を代入 cls.Circle(); //メンバ関数の呼び出し } } }
実行結果:
半径:4, 円周の長さ:25.12
コンストラクタについて
前章のサンプルコードでは「cls.r = 4;」のように、メンバ変数に直接、値を代入していました。しかし、実際に値をセットする際はメソッドを使うことが望ましいとされています。
その際に使われるメソッドに、コンストラクタがあります。コンストラクタはクラスを生成したときに自動的に実行される、初期化用のメソッドです。
先ほどのサンプルコードにコンストラクタを追加した例を紹介します。
using System; namespace SampleApplication { class Sample //クラス { int r; //メンバ変数 public Sample(int r){ //これがコンストラクタ //コンストラクタの処理を記述する this.r = r; //引数として渡された値をメンバ変数rに代入 } public void Circle() //メンバ関数 { double cir = 2 * 3.14 * r; Console.WriteLine("半径:" + r + ", 円周の長さ:" + cir); } public static void Main() { Sample cls = new Sample(4); //インスタンスを生成する際に、コンストラクタへ渡す引数を指定する cls.Circle(); //メンバ関数の呼び出し } } }
実行結果は先ほどと同様です。
この時のポイントは、以下のようになります。
- コンストラクタ名は、クラス名と同じにする必要がある
- コンストラクタに引数を渡すときは、インスタンス生成する際に値を指定する
また、この例では「this.r = r;」という風にして値を代入しています。この時の「this」はインスタンス自身を表します。
上記の例のthis.rは、「このインスタンスにおける変数r」ということを意味しています。また、右側の「r」は引数として渡されたrになります。
thisはしばしば使われるので、こういう使い方があるという事を覚えておきましょう。
クラスの継承について
最後に、クラスの継承について解説致します。オブジェクト指向において、継承は重要な要素となります。
継承とは、あるクラスの機能を受け継いで新しいクラスを作ることを言います。
継承をする際には、クラスの宣言時に「Class名() : 継承したいClass名」というように記述します。実際のサンプルコードを確認しましょう。
using System; namespace SampleApplication1 { class Person //Personクラス { string name; int age; public Person(string name, int age) { this.name = name; this.age = age; Console.WriteLine("Personクラスのコンストラクタ"); Console.WriteLine("名前: " + name + ", 年齢: " + age); } } class Employee : Person // Personクラスを継承した、Employeeクラス { int id; string department; public Employee(string name, int age, int id, string department) : base(name, age) { this.id = id; this.department = department; Console.WriteLine("Employeeクラスのコンストラクタ"); Console.WriteLine("社員番号: " + id + "部署: " + department); } public static void Main(){ Employee empl_1 = new Employee("ichiro", 25, 123456, "system"); //インスタンスを生成 } } }
実行結果:
Personクラスのコンストラクタ 名前: ichiro, 年齢: 25 Employeeクラスのコンストラクタ 社員番号: 123456部署: system
上記のコードでは、Personクラスを継承したEmployeeクラスを実装しました。実行結果を見ると、Personクラスの処理も実行されている事が分かります。
この時、基本となったPersonクラスを基底クラス、継承したEmployeeクラスを派生クラスと言います。
実行時に基底クラスの処理 -> 派生クラスの処理という順に実行されることも覚えておくと良いかと思います。
コンストラクタや継承については以下記事にも詳しく書いています。加えてご覧いただけると幸いです。
まとめ
今回の記事では、以下の点について解説しました。
- クラスとは
- クラスの設計方法
- クラスとインスタンス
- コンストラクタについて
- クラスの継承について
ポイントとしては、以下の点や用語をおさえていただければと思います。
- クラス、メンバ変数、メンバ関数の書きかた
- インスタンス
- コンストラクタ
- this
- 継承
冒頭でも説明した通り、クラスについての知識は必要不可欠になります。ここで用語だけでも覚えて、これからの学びに活用していってください!