1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【C#入門】オブジェクト指向の『カプセル化』についてまとめた

Last updated at Posted at 2020-04-07

この記事では、《オブジェクト指向の『カプセル化』》について、
業務を通して学習した内容を、備忘録としてまとめています。

  • 『カプセル化』とは…?
  • 『カプセル化』すると何がいいのか…?
  • フィールドの設定方法

こういった内容についてまとめています。

※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。

【概要】 『カプセル化』 とは…?

capsule_1.jpg

クラス内のフィールド(メンバー変数)をprivateで宣言することで…

__外部からの値の参照・変更を制限__することができます。

変数を、クラスで包む、囲むイメージ。

『フィールド』とは・・・
クラスのメンバー変数として定義され、クラス内に直接書かれる変数のことで、フィールドと呼ばれます。
『フィールド』は、クラス内のメソッドから参照可能です。

例えば、下記のように記述します。

namespace Sample
{
    public class Program
    {
        private int _num = 0;

        public Program(int num)
        {
            _num = num;
        }
    }
}

上記はコードは・・・

_num変数がprivateのフィールドで宣言されており、カプセル化されている状態です。

この_numを変更するためには…

コンストラクタでint型の値を指定することで、_numの初期値を変更することができます。

【メリット】 『カプセル化』 すると何がいいのか…?

list_2.jpg

  • コードが理解しやすく(読みやすく)なる
  • 値とロジックを1つにまとめることができる
  • 不正な値が設定されることを防げる
  • 保守性が高くなる

『カプセル化』をすると、__外部からの値の参照・変更が制限される__ため、宣言しているフィールドに設定される値は、必ず自分自身のクラスで設定する必要があります。

そのため・・・

そのフィールドにどういった値が設定されるかは、そのクラスを読むだけで理解できるようになります。

また・・・

外部からフィールドを設定することを許可してしまうと、意図していない(許可したくない)値が設定される可能性があります。

そこで・・・

『カプセル化』をすることで、__不正な値が設定されることを、事前に防ぐことが可能__です。

『カプセル化』したフィールドの設定方法|外部から変更する

capsule_2.jpg

繰り返しになりますが…

『カプセル化』をすることで、__外部からの値の参照・変更を制限__することができます。

ですが・・・

外部から値を設定できないので、クラスとしては機能しなくなります。

そのため・・・

何らかの方法で、外部からの値の変更を可能にする必要があります。

『カプセル化』されているフィールドの値を外部から変更する方法は…

  1. コンストラクタ
  2. プロパティ

を使った2つの方法があります。

方法①: コンストラクタ

先ほど少し紹介しましたが…

コンストラクタでフィールドのの初期値を変更することができます。

namespace Sample
{
    public class Program
    {
        private int _num = 0;

        public Program(int num)
        {
            _num = num;
        }
    }
}

上記はコードは・・・

_num変数がprivateのフィールドで宣言されており、カプセル化されている状態です。

この_numを変更するために…

コンストラクタでint型の値を指定することで、_numの初期値を変更しています。

方法②: プロパティ

値を設定するメソッドを公開する。

コンストラクタで設定する方法は、クラスを生成するときにしか動作しないため、初期値しか指定することができません。

生成後に値を変更したくても、コンストラクタだけでは対応できません。

そこで・・・

値を変更することのできるメソッドを公開するやり方があります。

namespace Sample
{
    public class Program
    {
        private int _num = 0;

        public int Num
        {
            set { _num = value; } //値の代入
            get { return _num; } //外部に値を返す
        }
    }
}

set{}の中には…

フィールド(メンバー変数) = value

というように記述します。

valueは、利用者側のクラスで代入された値が格納される『予約語』になります。

また・・・

get{}の中には…

return フィールド(メンバー変数)
~~~

というように、戻り値を記述します。

#### 【補足】 C#3.0での書き方

C#3.0では、プロパティの`set`、`get`の中身を省略して記述できるようになりました。

ちなみに・・・

この機能を『自動プロパティ』と言います。

~~~cs
namespace Sample
{
    public class Program
    {
        private int _num = 0;

        public int Num { set; get; }
    }
}
~~~

#### 【補足】 C#6.0での書き方

C#6.0では、初期値を指定できるようになりました。

~~~cs
public int Num { get; set; } = 100
~~~

ちなみに・・・

上記のコードは、以下と同様になります。

~~~cs
private int _num = 100;

public int Num
{
    set { _num = value; }
    get { return _num; } 
}
~~~
1
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?