C# オブジェクト指向編 クラス インスタンス part2-1
今回はオブジェクト指向について解説します.
はじめに
何故,オブジェクト指向を学ぶ必要があるのか.
一言で言えば,プログラムの可読性,拡張性,保守性を上げる為に学ぶ必要があります.
オブジェクト指向とは,あるデータの情報(データ)や機能(処理)を,クラスというプログラムの単位にまとめ,そのクラス(のインスタンス)を組み合わせて大きなプログラムを作っていくという考え方.
他の人のプログラムを見た時に,プログラムが読みやすければ,解読や修正も比較的短時間でできる.
何か機能を追加したい時に,部分的に実装して組み込めば簡単にできる.
(モジュールのように使うことができる.)
バグなどの不具合が見つかった時に,クラス単位でバグを探す事ができるので,全体から探すよりも短時間で修正できる.
(原因も見つかりやすい.)
などなど,メリットしかないです!
では次の項から本題に入ります.
クラス
先ほども,ちらっと説明に出てきましたが,もう一度整理します.
クラスとは,
ある情報(データ)や機能(処理)を持ったプログラムのかたまり
です.
※ある情報とは,データ型(int型,string型など)で宣言されたデータの事です.
また,
ある情報をフィールド,
機能をメソッド
と言います.(これらをまとめてメンバと呼ぶこともある.)
とりあえずは,
変数(定数)とメソッドを持ったかたまり ⇒ クラス
と思って貰ってもいいでしょう.
クラスの宣言
C#でクラスを記述するときには,次のように書きます.
class クラス名{
// クラスの内容
}
このように,クラスをプログラムコードに記述することを,
クラスを定義する
または
クラスを宣言する
と言います.
例えば,このように記述します.
class Car
{
int number; // 番号
string name; // 名前
void Run() // 走行処理
{
// 省略
}
}
青字がフィールドで,
赤字がメソッドです.
インスタンス
クラスについては,解説しましたが,
クラスを宣言するだけでは,使うことができません.
実は,クラスと言うのは設計図みたいなもので,中身が存在しません.
中身を作る為に,インスタンスを生成するという操作が必要になります.
生成には,newというキーワードを使います.
new クラス名();
例えば,このように記述します.
new Car();
生成するイメージを図にするとこんな感じです.
実際には,このように使う事が多いです.
クラス名 変数名 = new クラス名();
new クラス名() で生成したクラスのインスタンスを変数に代入しています.
この変数はクラス名の型になるので,代入する事ができます.
例えば,このように記述します.
Car car = new Car();
Car型のcarにnew Car()で生成したCarクラスのインスタンスが代入されています.
このように,クラスはデータ型(int型,string型など)のように扱えるということです.
ちょっとややこしいのでまとめると,
① Car carでCar型の変数 car を宣言する.
② new Car(); でCarクラスのインスタンスを生成する.
③ 変数 car はCar型の変数だから,②で生成したインスタンスをそのまま代入する事ができる.
また,このように記述しても同じになります.
Car car;
car = new Car();
先ほど,クラスは設計図みたいなものと言いました.
何故ならクラスは,何度でも使う事ができるからです.
イメージとしてはこんな感じです.
コードで記述すると次のようになります.
Car car = new Car(); // 自動車
Car taxi = new Car(); // タクシー
Car bus = new Car(); // バス
Car fireEngine = new Car(); // 消防車
このように,クラスは同じ構造の物を作りたい時に凄く便利です.
インスタンス変数
最後にインスタンス変数を解説して,今回は終わろうと思います.
インスタンス変数は,生成したインスタンスが持つ変数(フィールド)の事を言います.
インスタンスを生成しただけでは,中の情報まで操作をしていないので,
フィールドの情報は空のままです.
インスタンスを生成した後は,インスタンス変数に値を代入する事ができるようになります.
代入するには,次のように記述します.
変数名.インスタンス変数名 = 値;
例えば,このように記述します.
car.number = 1;
car.name = "car";
これで生成したインスタンスに情報を与える事ができました!
最後にソースコードを貼って終わろうと思います
using System;
namespace Training
{
class Program
{
static void Main(string[] args)
{
Car car = new Car(); // 自動車
car.number = 1;
car.name = "自動車";
Car taxi = new Car(); // タクシー
taxi.number = 2;
taxi.name = "タクシー";
Car bus = new Car(); // バス
bus.number = 3;
bus.name = "バス";
Car fireEngine = new Car(); // 消防車
fireEngine.number = 4;
fireEngine.name = "消防車";
Console.WriteLine("ID:" + car.number + " 名前:" + car.name);
Console.WriteLine("ID:" + taxi.number + " 名前:" + taxi.name);
Console.WriteLine("ID:" + bus.number + " 名前:" + bus.name);
Console.WriteLine("ID:" + fireEngine.number + " 名前:" + fireEngine.name);
}
}
public class Car
{
public int number; // 番号
public string name; // 名前
}
}
Carクラスには,publicという修飾子が付いていますが,後々解説するのでとりあえず今は付けて置いてください.
実行結果