こんにちは、コイキングです。
本記事では OOP(Object Oriented Programming == オブジェクト指向プログラミング)の説明のうち、カプセル化について、説明したいと思います。
1. カプセル化とは?
カプセル化とは関りがあるデータと行為をまとめて、'クラス'という'カプセル'に盛り付け事を意味します。
実はクラス作る際に知らず知らずのうちにカプセル化をしていたとも言えます。
2. カプセル化の理由
1) コードの活用・管理
例えると犬クラスに翼という属性を定義すると、犬クラスに翼属性があるとは思えないでしょう?
つまり、関りがない属性とメソッドはちゃんと活用されたり、管理されることが難しいでうs。
関りがある物だけクラスというカプセルに集めておくとソースコードを再活用・管理する事がより良くなります。
2) 情報隠蔽
クラス内に集めておいたメンバー変数とメソッドをどこにでも呼び出せるとクラスの元の設計された意図通り動作しない可能性が高くなります。この様なことを予防するための特性が情報隠蔽です。
どこにでもメンバー変数とメソッドを呼び出すのではなく必要な所で決まった方法にたけ呼出すとクラスの元の設計された意図通りに動作する可能性が高くなります。
Javaでは情報隠蔽をアクセス制御子を用いて実装できます。
※ アクセス制御子
(1) public
クラス、コンストラクター、変数、メソッドに定義可能、とこにでもアクセス可能。
(2) default
アクセス制御子を定義しない状態、同じパッケージ内でアクセス可能。
(3) private
コンストラクター、変数、メソッドに定義可能、同じクラス内部からでのみアクセス可能。
(4) protected
コンストラクター、変数、メソッドに定義可能、同じパッケージ内 又は継承したクラスからアクセス可能。
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Mary", 200, "Akita");
Bird bird = new Bird("Wings", "Long-beak");
// public
System.out.println("Dog's Name : " + dog.name); // アクセス可能。
// default
//System.out.println("Dog's hp : " + dog.hp); // 同じパッケージではないためアクセス X
// private
// System.out.println("Bird's wing : "+bird.wing); // privateのため、アクセス X
System.out.println("Bird's wing : "+bird.getWing()); // privateの場合、getメソッドを用いてアクセス
// protected
System.out.println("Bird's beak : "+bird.beak); // 同じパッケージのため、アクセス O
}
}
※ 例示コード
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/objective/basic03
※ 韓国語のポストは以下のURLで確認できます。
https://koiking.tistory.com/89