クラスとメソッド
はじめに
最近、C#を用いてオブジェクト指向プログラミングの学習をしている。 クラス、カプセル化、継承、ポリモーフィズムなど、オブジェクト指向を知らない私でもよく耳にする。そろそろオブジェクト指向がどのようなものか理解しようと思い、このブログに学習した内容をまとめた。C#を選んだ理由は、今後Windowsアプリを作ってみたいなと思ったからと、色んな参考書を見た中でC#が分かりやすそうだったからだ。
目次
クラスとメソッド
クラス
クラスの意味や使い方をまとめた。
理解編
クラスとインスタンス
クラス はデータとデータ処理を1つのブロックとして定義したものである。データ部分を データメンバー 、データ処理を 関数メンバー と呼び、データやデータ処理をまとめて メンバー と呼ぶ。それぞれのクラスには、関連性の強いデータとデータ処理がまとめられている。
クラスで直接宣言される変数があり、その変数をフィールド と呼ぶ。フィールドは、メンバー変数 とも呼ばれている。
クラスを定義する場合は、class
を使用してブロック内でメンバーを定義する。クラスを使用するには クラスの宣言 と クラスのインスタンス化(メモリ領域の確保) が必要である。
クラスの宣言はクラス名に続けて変数名を指定すればよい。
クラス名 変数名
クラスのインスタンス化はnew演算子
を使用し、new演算子の後にクラス名とパラメータを指定すればよい。
変数名 new クラス名();
クラスは参照型なのでクラスを宣言のみだと、参照先のアドレスを確保するだけらしい(変数にnullが入る)。new演算子は、クラスのデータを置くためのメモリ領域を確保する役割を担う。 インスタンス化によって生成されたものを、クラスの実体 または オブジェクト と呼ぶ。
クラスの宣言とクラスのインスタンス化は一緒に行うこともできる。
クラス名 変数名 = new クラス名();
クラス内のデータメンバーにアクセスする場合は、ドット演算子(.)を使用すればいよい。
インスタンス名.メンバー名
実践編
クラスとインスタンス
クラスの概念については理解したので、次は実際にコードを書いてみる。
// クラスの定義 class Car { // field string name; int seats = 4; } class MainClass { static void Main() { //----クラスのインスタンス化----//- // クラスの宣言 Car mycar; // new演算子を使用して、クラス「Car」を呼び出す。 mycar = new Car(); // クラスの宣言と呼び出しをまとめて書く場合 //Car mycar = new Car(); // ドット(.)演算子を使用して、mycarクラスのメンバーにアクセスする。 mycar.name = "マイカー"; Console.WriteLine(mycar.name); Console.WriteLine(mycar.seats); } }
この出力結果は、次となる。
マイカー 4
メソッド
メソッドはC言語でいうところの関数みたいなものらしい。そのメソッドについて調べたことをまとめた。
理解編
メソッド は関数メンバーの一部であり、データ処理を行うものである。メソッドは次のように定義することで使用できる。
アクセス修飾子 戻り値の型 メソッド名( 引数 ) { 処理内容 }
メソッドの呼び出しは、インスタンス名を指定して呼び出す方法 (インスタンスメソッド) と クラス名を指定して呼び出す方法(クラスメソッド) がある。
インスタンスメソッド
インスタンス名を指定して呼び出す方法において、クラスのインスタンスを生成しないと呼び出せないメソッドのことを インスタンスメソッド と呼ぶ。
クラスメソッド(静的メソッド)
一方、クラス名を指定して呼び出すメソッドのことを、クラスメソッド 、または 静的メソッド と呼ばれる。クラスメソッドは、アクセス修飾子の前にstatic
を付ければよい。
また、クラスメソッドの呼び出しは、インスタンスを生成せずに呼び出し可能で、クラス名.メソッド名(引数)
とすればよい。ただし、クラスメソッドはインスタンスを指定して呼び出す(インスタンス名.クラスメソッド)ことができない。
インスタンスメソッドとクラスメソッドの違いは分かったが、設計時の使い分けはどうすればよいのだろうか? オブジェクト指向の概念やメリットを理解していないから使い分けができていないのだろう。
静的クラス
クラスメソッドつながりで、静的クラスについても記載する。 静的クラスは、インスタンス生成せずにクラス内のメンバーやメソッドにアクセスできるものである。静的クラスを使用する場合は、classの前にstatic
を付ければよい。静的クラスは、インスタンスを生成せずにアクセスできるデータや処理を作成するときに使用するらしい。
コンストラクタ
インスタンス生成時に呼び出される特殊なメソッドがある。この特殊メソッドを コンストラクタ と呼ぶ。コンストラクタは、インスタンス生成時に呼びされることから、フィールドの初期化 や クラス内部での初期化処理 などで利用される。
コンストラクタを使用する場合は、戻り値を持たすことができない 、 アクセス修飾子が制限されている (通常はPublicを使用するらしい)いう制約がある。また、初期化が不要な場合コンストラクタの省略が可能である。 コンストラクタが複数ある場合、 引数によって自動的に呼び出すコンストラクタが選択 される。引数のないコンストラクタのことを 既定のコンストラクタ という。
デストラクターと呼ばれるコンストラクタと対になる機能がある。 デストラクター はインスタンスが消滅する時に呼び出される特殊なメソッドである。ただし、あまり使用しないらしいので、現時点では言葉の意味を知る程度でとどめておく。
実践編
インスタンスメソッド
インスタンスメソッドを使用したコードを次に記載する。
class MainClass { // メソッドの生成 public void Printf() { Console.WriteLine("Hello world !!"); } static void Main() { //MainClassのインスタンス生成 MainClass mC = new MainClass(); //クラスメソッドの呼び出し mC.Printf(); } }
この出力結果は、次となる。
Hello world !!
クラスメソッド
クラスメソッドを使用したコードを次に記載する。
class MainClass { // メソッドの生成 static public void Printf() { Console.WriteLine("Hello world !!"); } static void Main() { MainClass.Printf(); } }
この出力結果は、次となる。
Hello world !!
静的クラス
静的クラスを使用したコードを次に記載する。
static class ClassStatic { // 静的メンバー public static int a = 5; public static void Display() { Console.WriteLine(a); } } class Program { static void Main(string[] args) { // インスタンス生成せずにクラスのメソッドを使用する ClassStatic.Display(); } }
この出力結果は、次となる。
5
コンストラクタ
コンストラクタを使用したコードを次に記載する。
class Car { // フィールド public int seats; public string name; // 1つ目のコンストラクタ public Car() { seats = 4; } // 2つ目のコンストラクタ public Car(string str) { name = str; } } class Program { static void Main(string[] args) { //インスタンス生成するときの引数で、呼び出すコンストラクタが自動的に選択される。 // 引数なしでインスタンス生成した場合、1つ目のコンストラクタが呼び出される。 Car instCar = new Car(); Console.WriteLine("seats: " + instCar.seats); Console.WriteLine("name : " + instCar.name); // 引数ありでインスタンス生成した場合、2つ目のコンストラクタが呼び出される。 Car instCar2 = new Car("MYCAR"); Console.WriteLine("seats: " + instCar2.seats); Console.WriteLine("name : " + instCar2.name); } }
この出力結果は、次となる。
seats: 4 name : seats: 0 name : MYCAR