オブジェクト指向①カプセル化

オブジェクト指向の記事でも触れましたがここではオブジェクト指向のうちの1つ、カプセル化について紹介します。オブジェクト指向の記事は→こちら

重複しますが、

カプセル化とはそのオブジェクトが持つ「属性(データ・情報)」と「操作(機能)」を一体化して表現すること。

システム的に表現すると、アクセス修飾子を用いて、外部のクラスからのフィールド・メソッドへのアクセスを制御する事をカプセル化と言います。

ポイントは以下の通り

  • 外部からのアクセスによるトラブル(書き換えや予期せぬ用途での起動・使用など)を防ぐため、外部に公開する必要のないフィールドやメソッドはすべて隠す。
  • 外部にメンバ(特にフィールド)へのアクセスを許す場合もそのメンバにアクセスするための正式な手続き方法(アクセス用メソッド)のみを公開する。

これは問題によく出ます。関係性や特徴を理解しないと解くのは難しいです。

アクセス制御を行うための修飾子をアクセス修飾子と言います。カプセル化の説明でアクセスを防ぐだったり、隠すなどという言い回しがありましたがその為に使われるものですね

アクセス修飾子は主に4つあります

  1. public           どのクラスからでも利用可能
  2. protected          継承したサブクラス、もしくは同一パッケージ内のクラスから利用可能
  3. なし            同一パッケージ内のクラスからのみ利用可能
  4. private           同一クラス内からのみ利用可能

上から順に制限が厳しくなるイメージです。基本的にメソッドやフィールドの頭に付けます。

オブジェクト指向では基本的に4番を付けます。

クラスに使用可能なのは1番、3番

メンバ(変数・メソッド)に使用可能なのは1~4番になります。

purotected以外で抑えるポイントは以下の通りです。

  • 同じクラス内ではアクセス制限なし
  • 同パッケージ内の別クラスからのアクセスはprivateのみ制限
  • 外部パッケージのクラスからのアクセスは基本的にpublic以外不可

protectedにおいて抑えるポイントは

  • 継承関係ができているサブクラスからスーパークラスへのアクセスを行う場合はパッケージを跨いでアクセスできる。
  • もしくは同一パッケージ内のクラスからであればアクセスできる。

継承限定で使うようなイメージですね。サブクラスだけ特別扱いされている感じですね。

4番のprivateを付けるとして、じゃあどうやってprivateがついてる変数やメソッドを他のクラスから使うんや!という時に表題の通りgetterとsetterを使います。

これはprivateを付けたフィールドを外部から参照・変更ができるような専用のメソッドです。別名:アクセサ/アクセス用メソッドなんて言い方もあります。

  • getter   ⇒参照用メソッド
  • setter   ⇒代入用メソッド

getterの構文は(フィールド名をabcとする場合)

(public)フィールドの型 getAbc(){return abc;}

setterの構文は(フィールド名をabcとする場合)

(public)void setAbc(フィールドの型 引数名){abc = 引数名;}

getterは引数無しで呼び出されると対応するprivateなフィールドの値を参照し、戻り値として返すのみのフィールドです。

setterは引数を対応するprivateなフィールドに代入するだけのメソッドです。

getやsetとフィールド名がわかりやすいように記述する際はフィールド名の頭文字を大文字にします。

絶対に両方定義する必要はありません。また、双方基本的にpublicで定義します。

つまり元の値はいじらないように、使いたいときは間接的にいじれるようにこの二つを使うということなんですね。

コメント

タイトルとURLをコピーしました