【Java入門】カプセル化について詳しく徹底解説!(オブジェクト指向)




新米太郎
新米太郎

皆さんこんにちは新米です。

今回はJavaのカプセル化について詳しく解説していきたいと思います。

カプセル化は今後Javaを使った開発では、絶対に欠かせない重要な知識となります。

また、Java言語以外のオブジェクト言語でもカプセル化はよく使われますので、この機会に覚えましょう!

 

新米太郎
新米太郎

カプセル化ってなんですか?

新米先生
新米先生

カプセル化はオブジェクト指向の一つです。

これから詳しく解説していきますね!

新米太郎
新米太郎

よろしくお願いします!

そもそもカプセル化とは?

カプセル化はオブジェクト指向の1つですが、オブジェクト指向と言われても抽象的で難しいですよね💦

初めは理解できなくて大丈夫です。

オブジェクト指向は以下の3つを表しますので、1つずつ学習し知識を深めていきましょう!

オブジェクト指向3大要素

継承
・カプセル化 ←今回はカプセル化のみ学びます。
ポリモーフィズム 

 

カプセル化とは情報の隠蔽を目的とし、オブジェクトが持つ属性と操作を一体化して表現することを表します。

情報隠蔽は外部に公開しなくていいものを情報を非公開にすることです。

 

新米太郎
新米太郎

属性と操作の一体化??抽象的でよくわかりません…

新米先生
新米先生

安心してください。今から具体的に説明します!

既に理解した方は読み飛ばしても大丈夫です。

新米太郎
新米太郎

わかりました!

エアコンの温度調整で考えてみましょう。

この場合、属性が「設定温度」で操作が「温度の変更」を表します。

温度を変更すると言うことは設定温度(属性)を変更することになります。

 

つまり、操作によって属性が変わると言うことです。これを一体化と言います。

Java言語では、属性を変数で表現し変数名と値を持ちます

例)変数温度 = 27℃ ;

 

操作はオブジェクト(クラスやインスタンス)呼び出されることにより動作し、操作はメソッドで表現します。

カプセル化では、属性へ直接アクセスするわけではなく、操作にアクセスし属性の変更を行ったりします。

 

ではなぜ、操作(メソッド)にアクセスするのでしょうか?

次にそれを踏まえてカプセル化のメリットについて話していきたいと思います。

カプセル化のメリット

カプセル化には以下のメリットがあります。

・外部から属性を直接変更されないようにするため。(情報隠蔽)

カプセル化は属性を直接変えられないようにするのが最大のメリットです。

 

では、カプセル化をしないとどうなるか先程のエアコンの温度調整で考えてみましょう。

もし属性(温度)を直接変更できたらマイナス20℃みたいに変更できてしまいます。

だからカプセル化は必要で、属性を直接アクセスさせないで、あらかじめ操作の処理内容に「設定温度の範囲」を決めておくことであり得ない値になることを阻止できます。

 

では次にカプセル化にする方法について話していきます。

実際にコードを書いてみよう。

[サンプルコード]

class User {

  private int id;
  private String name;

  User(int id, String name){

    this.id = id;
    this.name = name;
  }

  public void userInfo(){

    System.out.println("ID番号:" + id + " ユーザー名:" + name);
  }
}

public class Main {
  public static void main(String[] args) {
    
    User obj = new User(51,"新米太郎");
    obj.userInfo();

  }
}

[実行結果]

ID番号:51 ユーザー名:新米太郎

解説

外部から直接変更されないためには、3・4行目でprivate修飾子を使います。

修飾子は以下の種類があります。

アクセス修飾子

アクセス範囲

public

どこからでもアクセス可能

protected

クラス内および継承先からアクセス可能

修飾子なし

クラス内および同一パッケージからアクセス可能

private

クラス内からのみアクセス可能

Java言語でカプセル化を行う時は、基本メンバ変数にprivate,メソッドにpublicを付与します。

21行目でUserクラスをインスタンス化し、6行目のUserコンストラクタを呼び出しています。

コンストラクタないではthisにidとnameの値をそれぞれ格納しています。

22行目で12行目のメソッドを呼び出し、14行目の処理で8・9行目の値を出力しています。

 

新米太郎
新米太郎

変数に対して直接アクセスできないようにprivate修飾子を使うんだね!

まとめ

いかがだったでしょうか。

今回はJavaのカプセル化について解説しました。

僕も最初はカプセル化の使い道があまり理解できていませんでしたが、Javaを学習していくうちに

カプセル化の必要性が分かるようになりました。

まずは、簡単なコードでいいので実際に書いてみて理解を深めていってください!




コメント

  1. […] ・継承 ・ポリモーフィズム ・カプセル化 […]

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