staticクラスとstaticメソッドを料理で理解する:newしないで呼び出す共通の道具箱

広告

C#を学び始めると、staticという言葉が何度も登場します。最初は難しそうに見えますが、まずは「特定の1つの物を作る前から使える、共通の道具箱」と考えると理解しやすくなります。

この記事では、「料理」と「レシピ」を題材にして、static修飾子・staticクラス・staticメソッドの基本を見ていきます。

staticとは「みんなで使う共通の道具箱」

通常のクラスは、newを使ってインスタンスを作り、そのインスタンスごとにデータを持たせます。一方、staticなメンバーはインスタンスを作らなくても使えます。

たとえば焼きそばの作り方は、「Aさん専用の手順」「Bさん専用の手順」のように、作る人ごとに別の状態を持つ必要がありません。決まったレシピを共通の道具箱に入れておき、必要なときに呼び出せば十分です。このため、「料理・レシピ」はインスタンスの状態を持たないstaticメソッドの説明に向いています。

複数の人が同じ料理道具箱を共有して使うイラスト
staticは、インスタンスを作る前からみんなで使える「共通の道具箱」のイメージです。

完成したサンプルコード

using System;

namespace StudentClassTutorial
{
    static class 料理
    {
        public static void 焼きそばを作る()
        {
            Console.WriteLine("材料を用意する");
            Console.WriteLine("野菜を炒める");
            Console.WriteLine("麺を加えて炒める");
            Console.WriteLine("ソースで味付けする");
            Console.WriteLine("皿に盛り付ける");
        }

        public static string お好み焼きを作る(int 枚数)
        {
            int 小麦粉の量 = 100 * 枚数;

            Console.WriteLine($"小麦粉を{小麦粉の量}g計量する");
            Console.WriteLine("生地の材料を混ぜる");
            Console.WriteLine($"{枚数}枚分の生地を焼く");
            Console.WriteLine("ソースをかけて盛り付ける");

            return $"{枚数}枚のお好み焼きができました";
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            // staticクラスはnewできません
            // コメントを外すとコンパイルエラーになります
            // 料理 特別な料理 = new 料理();

            料理.焼きそばを作る();

            string 結果 = 料理.お好み焼きを作る(3);
            Console.WriteLine(結果);
        }
    }
}

注釈:このサンプルでは、初学者が処理の意味を直感的に理解できるよう、日本語のクラス名・メソッド名・変数名を使用しています。また、基本情報技術者試験の疑似言語に近い感覚で読めるようにする意図もあります。C#では日本語の識別子を使用できますが、実務では英語で命名することが一般的です。

namespaceは1つにまとめています。料理クラスとProgramクラスが同じ学習例の中にあることが分かりやすく、初学者が「なぜnamespaceが2つに分かれているのだろう」と迷わずに済みます。

staticクラスはnewできない

static class 料理と宣言したクラスは、インスタンスを作れません。そのため、次のコードはコメントアウトしています。

// 料理 特別な料理 = new 料理();

コメントを外すとコンパイルエラーになります。この行をあえて残すことで、「staticクラスはnewできない」という特徴を実際に試せる教材になります。エラーを見ることも、仕組みを理解する大切な実験です。

クラス名.メソッド名で直接呼び出す

staticメソッドは、インスタンスを作らずに「クラス名.メソッド名」で呼び出します。

料理.焼きそばを作る();

ここでは、料理がクラス名、焼きそばを作るがメソッド名です。new 料理()を先に書いていない点に注目してください。共通の道具箱である料理クラスから、必要な道具を直接取り出すイメージです。

2つのメソッドで引数と戻り値を比べる

枚数を入力し、お好み焼きを作って結果を返す流れのイラスト
引数として枚数を受け取り、調理処理を行い、完成結果を戻り値として返す流れです。

焼きそばを作る()は、引数なし・戻り値なしのメソッドです。呼び出すだけで、決められた手順を順番に表示します。戻り値がないため、戻り値の型にはvoidを指定しています。

public static void 焼きそばを作る()

一方、お好み焼きを作る(int 枚数)は、引数あり・戻り値ありのメソッドです。枚数を受け取り、必要な小麦粉を100 * 枚数で計算し、小麦粉の量という変数に保存します。最後に完成した枚数を含む文字列を返すため、戻り値の型はstringです。

string 結果 = 料理.お好み焼きを作る(3);
Console.WriteLine(結果);

結果変数で戻り値を受け取り、Console.WriteLine(結果);で表示するところまで書くことで、「返された値を受け取って使う」という流れが完結します。実行すると、料理の手順に続いて「3枚のお好み焼きができました」と表示されます。

staticが向かない場合もある

共通の料理レシピと個別の生徒データを比較するイラスト
共通の処理はstatic、名前や点数など個別の状態を持つものはインスタンスが向いています。

すべてをstaticにすればよいわけではありません。たとえばStudentクラスで、生徒ごとに名前や点数を持たせたい場合を考えてみましょう。

Student 田中さん = new Student("田中", 80);
Student 佐藤さん = new Student("佐藤", 95);

田中さんと佐藤さんでは、名前も点数も異なります。このように個別の状態を持つものは、newして別々のインスタンスを作る方が自然です。

  • 共通の処理で、個別の状態を必要としない:staticが候補
  • 人や商品など、1つずつ異なる状態を持つ:インスタンスが候補

まとめ

staticは「特定の1つの物を作る前から使える共通の道具箱」です。staticクラスはnewできず、staticメソッドは料理.焼きそばを作る();のように「クラス名.メソッド名」で直接呼び出します。

個別の状態が不要な共通処理にはstaticが便利です。一方、名前や点数など個別の状態を持つStudentのようなものは、インスタンスを作る方が自然です。この違いを意識すると、staticを使う場面を判断しやすくなります。

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

広告

.NET,C#

Posted by hidepon