C#のメソッドとは?StudentクラスのShowScore()から理解しよう

広告

前回の記事「Visual Studioで作る「Studentクラス」入門チュートリアル」では、Studentクラスを作り、名前と点数を持つ生徒を表すプログラムを作りました。

今回は、前回のコードに登場したShowScore()を入口にして、C#のメソッドを学びます。

foreach (var student in students)
{
    student.ShowScore();
}

このstudent.ShowScore();が、今回のテーマであるメソッドの呼び出しです。メソッドとは、簡単にいうと処理に名前を付けて、あとから呼び出せるようにしたものです。

student1.ShowScore()を呼び出し、Studentの名前と点数を使ってコンソールへ表示する流れ
student1からShowScore()を呼び出すと、その生徒の名前と点数が使われます。

メソッドを使わない場合

まず、メソッドを使わずに3人の点数を表示すると、次のようになります。

Console.WriteLine($"{student1.Name}さんの点数は{student1.Score}点です。");
Console.WriteLine($"{student2.Name}さんの点数は{student2.Score}点です。");
Console.WriteLine($"{student3.Name}さんの点数は{student3.Score}点です。");

3行とも、ほとんど同じ形です。同じような処理を何度も書くとコードが長くなり、表示の形式を変えるときにも何か所も直す必要があります。

点数を表示する処理をStudentクラスにまとめる

名前と点数は、どちらもStudentが持っているデータです。そのデータを表示する処理もStudentに関係しています。そこで、点数を表示する処理をStudentクラスの中に移動します。

class Student
{
    public string Name;
    public int Score;

    public void ShowScore()
    {
        Console.WriteLine($"{Name}さんの点数は{Score}点です。");
    }
}

このShowScore()がメソッドです。「名前と点数を表示する」という処理をまとめて、ShowScoreという名前を付けています。

ShowScoreメソッドを呼び出してみよう

メソッドを使いたいときは、インスタンス名のあとにドット、メソッド名、丸かっこを書きます。

student1.ShowScore();
student2.ShowScore();
student3.ShowScore();

student1.ShowScore();は「student1の点数を表示する」と読めます。Console.WriteLineを直接書くよりも、何をしているコードなのかが分かりやすくなります。

実行結果は次のとおりです。

田中さんの点数は80点です。
佐藤さんの点数は95点です。
鈴木さんの点数は70点です。

public void ShowScore()の意味

public void ShowScore()
{
    Console.WriteLine($"{Name}さんの点数は{Score}点です。");
}

public

publicは、クラスの外から使えるようにするための指定です。今回はMainメソッドからstudent1.ShowScore();のように呼び出すため、publicを付けています。

void

voidは、結果を呼び出し元に返さないという意味です。ShowScore()は画面に表示するだけなので、voidを使っています。

ShowScore

ShowScoreはメソッド名です。何をするメソッドなのかが分かる名前を付けると、コードが読みやすくなります。

丸かっこと波かっこ

()はメソッドに渡す値を書く場所です。今回は何も受け取らないので中身は空です。{ }の中には、実際に実行したい処理を書きます。

NameとScoreをそのまま使える理由

ShowScore()Studentクラスの中にあります。そのため、同じクラスにあるNameScoreを、そのまま使えます。

student1.ShowScore();と呼び出したときはstudent1の名前と点数が使われ、student2.ShowScore();ではstudent2の名前と点数が使われます。つまり、同じメソッドでも、どの生徒から呼び出したかによって使われるデータが変わります

3人のStudentインスタンスが同じShowScoreメソッドを使い、それぞれ異なる点数を表示する図
同じShowScore()でも、呼び出したインスタンスによって表示される名前と点数が変わります。

メソッドは呼び出さないと動かない

メソッドは、作っただけでは動きません。Studentクラスの中にShowScore()を書いても、呼び出すコードがなければ点数は表示されません。

student1.ShowScore();

メソッドは「作ること」と「呼び出すこと」が別です。ここは初学者がつまずきやすいポイントなので覚えておきましょう。

配列とforeachでさらに便利になる

3人の生徒を配列に入れ、foreachで1人ずつ取り出すと、メソッドの便利さがよく分かります。

Student[] students = new Student[] { student1, student2, student3 };

foreach (var student in students)
{
    student.ShowScore();
}

studentの中身が田中さんなら田中さんの点数が、佐藤さんなら佐藤さんの点数が表示されます。同じstudent.ShowScore();という1行で、それぞれの生徒に合った表示ができます。

完成したコード

using System;

namespace StudentClassTutorial
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Student student1 = new Student();
            student1.Name = "田中";
            student1.Score = 80;

            Student student2 = new Student();
            student2.Name = "佐藤";
            student2.Score = 95;

            Student student3 = new Student();
            student3.Name = "鈴木";
            student3.Score = 70;

            Student[] students = new Student[] { student1, student2, student3 };

            foreach (var student in students)
            {
                student.ShowScore();
            }
        }
    }

    class Student
    {
        public string Name;
        public int Score;

        public void ShowScore()
        {
            Console.WriteLine($"{Name}さんの点数は{Score}点です。");
        }
    }
}

Console.WriteLineを直接書く場合との違い

foreachの中にConsole.WriteLineを直接書いても間違いではありません。しかし、ShowScore()を使うと「生徒を1人ずつ取り出して、その生徒の点数を表示する」という流れが読みやすくなります。

表示を「名前: 田中 / 点数: 80」に変えたい場合も、修正するのはメソッドの中だけです。

public void ShowScore()
{
    Console.WriteLine($"名前: {Name} / 点数: {Score}");
}

呼び出す側のstudent.ShowScore();は変更しなくてよいため、あとから修正しやすくなります。

メソッドは「できること」を表す

NameScoreはStudentが持っているものです。一方、ShowScore()はStudentができることです。

Student
├─ Name        名前を持っている
├─ Score       点数を持っている
└─ ShowScore() 点数を表示できる

クラスにはデータだけでなく、そのデータに関係する処理もまとめられます。これがオブジェクト指向の大切な考え方です。

staticが付かないのはなぜか

Mainメソッドにはstaticが付いていますが、ShowScore()には付いていません。ShowScore()は、それぞれの生徒が持つNameScoreを使い、student1student2といった実際のインスタンスから呼び出すメソッドだからです。

今の段階では「Mainはプログラムの開始場所なのでstaticが付いている」「ShowScoreは生徒のインスタンスから呼び出すのでstaticを付けない」と理解しておけば十分です。

よくある間違い

  1. 丸かっこを忘れる
    student1.ShowScore;ではなく、student1.ShowScore();と書きます。
  2. メソッドを作っただけで呼び出さない
    作ったメソッドは、使いたい場所から呼び出す必要があります。
  3. メソッドをクラスの外に書く
    今回のShowScore()はStudentのデータを使うため、Studentクラスの中に書きます。

今回は引数と戻り値を深追いしない

メソッドには「引数」「戻り値」「return」といった仕組みもあります。しかし、まずは次の3点を理解することが大切です。

  • メソッドは処理に名前を付けたもの
  • メソッドは呼び出すと動く
  • クラスの中にあるメソッドは、そのクラスのデータを使える

引数や戻り値は、次の段階で学ぶと理解しやすくなります。

まとめ

メソッドとは、処理に名前を付けて、あとから呼び出せるようにしたものです。今回のポイントを振り返りましょう。

  • ShowScore()は点数を表示するメソッド
  • メソッドは呼び出して初めて動く
  • Studentクラスの中にあるので、NameScoreをそのまま使える
  • student.ShowScore()と書くと、その生徒の点数を表示できる
  • メソッドにまとめると、コードが読みやすくなり、修正もしやすくなる

最初は難しく考えず、「よく使う処理に名前を付ける」「生徒に関係する処理はStudentクラスの中に入れる」と考えてみましょう。

この記事の前提となるクラス・インスタンス・配列・foreachの流れは、「Visual Studioで作る「Studentクラス」入門チュートリアル」で順番に確認できます。

次のステップ:メソッドへ値を渡す「引数」と、処理結果を受け取る「戻り値」は、「C#のメソッドの引数と戻り値とは?Studentクラスで理解しよう」で学べます。

訪問数 2 回, 今日の訪問数 14回

広告

C#,メソッド,初学者

Posted by hidepon