前回は「フィールドとプロパティ(クラスが持つデータ)」をやりました。

今回は、クラスに処理(ふるまい)を持たせる話。クラスの中のメソッドです。これで、クラスが「データ」と「処理」の両方を持つ、本当の意味でのまとまりになります。

クラスのメソッドとは、そのクラスが持つデータを使って、何かをする処理です。

データだけでは、もの足りない

前回までのクラスは、データ(名前・年齢)を持つだけでした。

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

でも、現実の「人」は、データを持つだけでなく、いろいろなことをします。あいさつをしたり、歩いたり。

クラスにも、データだけでなく「できること(処理)」を持たせられます。それが、クラスの中のメソッドです。

第15回でメソッドをやりましたが、それをクラスの中に書くわけです。

書き方を見てみる

「あいさつする」メソッドを、Person クラスに持たせてみます。

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public void Greet()
    {
        Console.WriteLine(Name + "です。よろしく!");
    }
}

Greet() というメソッドが、クラスの中に入りました。第15回でやったメソッドと、書き方は同じです。

ひとつ大事なのは、メソッドの中で Name をそのまま使っていること。クラスの中のメソッドは、同じクラスが持つデータ(フィールドやプロパティ)を、自由に使えます

使ってみる

実物を作って、メソッドを呼んでみます。

Person taro = new Person();
taro.Name = "山田";

taro.Greet();   // 山田です。よろしく!

taro.Greet() を呼ぶと、taro の名前(山田)を使って、あいさつしました。

ここがポイントです。同じ Greet() でも、呼ぶ実物によって結果が変わります

Person hanako = new Person();
hanako.Name = "田中";

taro.Greet();     // 山田です。よろしく!
hanako.Greet();   // 田中です。よろしく!

同じメソッドなのに、taro が呼べば「山田」、hanako が呼べば「田中」。それぞれの実物が、自分のデータを使って動くんです。

データと処理が、ひとつになる

ここで、第18回の「クラスはデータと処理をまとめたもの」という話が、完成します。

class Person
{
    public string Name { get; set; }   // データ
    public int Age { get; set; }       // データ

    public void Greet() { ... }        // 処理(ふるまい)
    public void Walk() { ... }         // 処理(ふるまい)
}

「人」が、名前や年齢というデータと、あいさつする・歩くというふるまいを、ひとつのまとまりとして持っている。

これが、オブジェクト指向の核心です。現実のものを、「持っているデータ」と「できること」のセットで表現する。「人」も「商品」も「車」も、そうやってクラスにできます。

メソッドの中で、自分のデータを変える

メソッドは、自分のデータを読むだけでなく、変えることもできます。

class Person
{
    public int Age { get; set; }

    public void BirthYear()
    {
        Age = Age + 1;   // 誕生日がきて、1つ年をとる
        Console.WriteLine(Age + "歳になりました");
    }
}
Person taro = new Person();
taro.Age = 20;

taro.BirthYear();   // 21歳になりました
taro.BirthYear();   // 22歳になりました

BirthYear() を呼ぶたびに、その人の年齢が1つ増えます。自分のデータを、自分のメソッドで変えていく。クラスが、生きているように動き始めます。

つまずきポイント

初心者が迷うのが、クラスの外のメソッドと、中のメソッドの違いです。

  • 第15回のメソッド(クラスの外)… 単独の処理
  • 今回のメソッド(クラスの中)… そのクラスのデータを使える処理

中のメソッドは、taro.Greet() のように、必ず実物(taro)から呼びます。「だれの Greet なのか」が決まっていないと、どのデータを使えばいいか分からないからです。

Greet();          // だれの? → エラー
taro.Greet();     // taro の Greet(正しい)

「クラスの中のメソッドは、実物から呼ぶ」。これを意識すると、すっきりします。

まとめ

クラスのメソッドは、そのクラスのデータを使う処理。

class Person
{
    public string Name { get; set; }       // データ

    public void Greet()                    // 処理
    {
        Console.WriteLine(Name + "です");  // 自分のデータを使える
    }
}

taro.Greet();   // 実物から呼ぶ
  • クラスは「データ」と「処理(ふるまい)」を、ひとつにまとめる
  • メソッドは、同じクラスのデータを読んだり変えたりできる
  • 同じメソッドでも、呼ぶ実物によって結果が変わる

次回は、たくさんの実物を作るときに使う インスタンス の話を、もう少しくわしく見ていきます。