0
0

カプセル化、アクセス修飾子

Posted at

カプセル化とは

カプセル化とは、クラス内のフィールドやメソッドに対するアクセスを制限するJavaの仕組み。
例えば、個人情報を扱うクラスがあり、このフィールドが外部から書き変えれたり情報を保護できないプログラムは危険。
カプセル化はこのような外部からのアクセスからオブジェクトを守る役目がある。

アクセス修飾子

カプセル化では、アクセス修飾子のprivateとpublicを使いアクセス制限を行うため、下記の設定を覚えておく。

アクセス修飾子 機能
private 自分のクラス内でのみアクセス可能
アクセス修飾子なし(package private) 同じパッケージ内であればアクセス可能
protected 継承した子クラス及び自分と同じパッケージからアクセスできる
public 自分のクラス以外からでもアクセス可能
package text.section_16;

public class Capsule_Tanaka1 {
	
	// id フィールド宣言 アクセス修飾子private
	private int id = 5;
	
	// コンストラクタ
	Capsule_Tanaka1(){	
	}
	
	//出力するメソッド
	public void output(){
		
		System.out.println("idは" + this.id);
	}
}

idフィールドはprivate int id = 5;となっていて、カプセル化されています。
一方で出力メソッドではpublic void output(){となっており、これは外部からのアクセスのみ許可していることになり安全なクラスと言える。
こちらのクラスに対して下記のコードを実行。
スクリーンショット 2024-02-12 19.58.38.png
実行結果は、出力メソッドがpublicなので下記の通り表示される。
スクリーンショット 2024-02-12 19.58.44.png

試しに、出力メソッドをplivateに変更したら実行結果はエラーになる。=外部からのアクセスも禁止になる。

// 出力するメソッドのアクセス修飾子をprivateに変更
//出力するメソッド
	private void output(){
		
		System.out.println("idは" + this.id);
	}

スクリーンショット 2024-02-12 20.01.56.png

ゲッター

ゲッターによりpublicなメソッドを通して、他クラスのprivateなフィールドの値を取得できる。

// ゲッターの書き方
public 戻り値の型 ゲッターの名前(){
   return this.フィールド変数名;
}

先ほどの出力メソッドを消去して下記のゲッターに書き換える。

public int getId(){
  return this.id;
  }

そして一方のクラス呼び出し側の方も、下記のように変更。
スクリーンショット 2024-02-12 21.06.15.png
実行結果
スクリーンショット 2024-02-12 21.06.39.png
(これは、先ほどのPublic voidメソッドとの使い分けはどういうところで判断するのかな?これに関して参考になった記事)

ではsetterを使うメリットは何でしょう?
代表的なものを2つ上げます

読取/書込専用にできる
コードチェックができる

publicのメソッドを使用した時と同様、他クラスからprivateなクラスの値を参照できた。

セッター

セッターは、privateなフィールドの値を編集できるメソッドをpublicで定義。

// セッターの書き方
public void セッターの名前(編集するフィールドの型 任意の引数名){
   this.フィールド変数名 = 任意の引数名
}

ゲッターの下に追記
スクリーンショット 2024-02-12 23.58.49.png
そして、クラス呼び出し側のファイルも下記のように編集。
スクリーンショット 2024-02-13 0.06.48.png
実行結果は、idがきちんと、setterで指定した値の7に変わっている。スクリーンショット 2024-02-13 0.08.15.png
getter/setterはセットで覚えておこう。

0
0
0

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
0
0