C#で覚えておくべきアクセス修飾子の基本を解説

この記事ではクラスを定義する・使用するときに重要となる「アクセル修飾子」と呼ばれるものを学習します。アクセス修飾子はプロパティやメソッドの「公開範囲」を設定するキーワードであり、クラスを定義して構築していく段階で必ずしも覚えなければならない内容となります。サンプルソースも交えながら解説していきます。

アクセス修飾子とは

C#においてアクセス修飾子とは「変数などの公開範囲を指定する」ための設定値だと思ってもらってかまいません。シンプルに言ってしまうと、クラスの内外から使用できるかどうかという点を決めるためにあります。

  • public ⇒ クラスの外からでもアクセス可能
  • private ⇒ クラス内からしかアクセス不可

具体的なソースコードは以下のような感じになります。これまでにもたくさん使用している「Personクラス」に大してprivate / publicの変数を持つようにしてみました。

public class Person
{
    //クラス内部のみアクセス可能なprivate変数
    private string name;
    //クラス外からアクセス可能なpublic変数
    public string Name;
}

アクセス修飾子は変数名などよりも先にきます。変数の場合は「private/public (型)(変数名)」で宣言するのです。またクラスにもアクセス修飾子の付与が可能です。「public class Person」となっている部分がそうです。

クラスにもアクセス修飾子は付与できますが、現段階では変数にprivate / publicが設定できる程度で押さえてもらえればよいでしょう。

アクセス修飾子のサンプル

それではアクセス修飾子を使用したサンプルを作成していきます。新規のコンソールアプリケーションを作成して、以下のように記述してみましょう。

using System;

namespace App07
{
    class Program
    {
        static void Main(string[] args)
        {
            Person Taro = new Person();
            Taro.Name = "Taro desu.";
            //Taro.age = 18; ⇒ エラーとなる

            Console.WriteLine(Taro.Name);
            //Console.WriteLine(Taro.age.ToString()); ⇒ エラーとなる

            Console.ReadLine();
        }

        //人間クラス
        public class Person
        {
            public string Name; //名前
            private int age;    //年齢
        }
    }
}

上記のサンプルでは、あえてprivateがついている行をコメントアウトしています。コメントアウトしている以下の行のコメントアウトを外してみてください。

Taro.age = 18;

また別の箇所も以下のようにしてみてください。

Console.WriteLine(Taro.age.ToString());

上記のコメントを外してみると、以下のような画面になるのではないかと思います。

赤の波線が引かれていますが、その赤線がエラーを示しています。よく見てみるとPersonクラスの「age」という変数は「private」のアクセス修飾子がついています。この変数に対してMainクラスからアクセスしようとしているのが、コメントを外してもらった行なのです。

MainクラスとPersonクラスは、どうみても別のクラスになりますよね。ですので、publicが付与されているNameにはアクセスできますが、privateが付与されているageにはアクセスできません。

Personクラスの外から呼ぶことはできないのに、Personクラスの外側からageを使おうとしているのでエラーになっているのです。なお、publicがついている場合は先頭を大文字都市、privateの場合は先頭を小文字にします。

publicとprivateは公開範囲

以上、これまでの連載でも何度か出現してきた「private」と「public」について解説しました。アクセス修飾子では、クラス内部の変数などに対して「どこまでの公開範囲であるか」を設定することができます。どうして公開範囲を設定するべきなのか、というのはもう少し先の話になるのですが、これにはちゃんとした意図があることなのです。

これまでのサンプルコード内で「どうしてpublicを付けるんだろう?」と感じていた人は、これで疑問が晴れたのではないかと思います。publicにすることで、クラスを飛び越えて、外側の世界からのアクセスを許容できるからなのです。

アクセス修飾子は今後もたくさんできますし、publicとprivateは必須知識でもあるので、現段階では、この2つは少なくとも覚えておく必要があります。ほかにも色々な編巣を使ってみたりして、publicとprivateについて理解を深めてみてください。