1.事前知識
事前知識として、上記リンクの内容が必要です。
2.カプセル化とは
-
カプセル化
とは、オブジェクトの属性と関連する操作をまとめて同じクラスに定義することである。 -
カプセル化
したクラスの属性にはアクセッサメソッド
を通してのみアクセスできる。 - 他のオブジェクトは、
カプセル化
したクラスに直接アクセスできない
ため、属性値が不用意に書き換えられるのを防ぐことができる。
3.基本的な書き方
テストクラス
package パッケージ名;
public class メインクラス名{
public static void main(String[] args) {
// インスタンスの生成
クラス名 変数名 = new クラス名();
// setterに値を入れる
変数名.setインスタンス変数名(実引数);
// getterで入れた値の取得をする
System.out.println(変数名.getインスタンス変数名());
}
}
カプセル化クラス
package パッケージ名;
class クラス名{
// インスタンス変数の定義
private 型名 変数名;
// コンストラクタ(インスタンス生成時に実行される)
クラス名(){
初期化処理など
}
// setter
void setインスタンス変数名(型名 引数名){
this.変数名 = 引数名;
}
// getter
型名 getインスタンス変数名(){
return 変数名;
}
}
- 基本的なカプセル化は上記のように記述します。
4.事前準備
- Eclipseを起動し、
[ファイル(F)]→[新規(N)]→[Java プロジェクト]
を選択する。
- プロジェクト名に
Test1
と入力し、完了
ボタンをクリックする。
-
[ファイル(F)]→[新規(N)]→[クラス]
を選択する。
- パッケージと名前に
Test1
と入力し、完了
ボタンをクリックする。
-
Test1.java
が作成されたことを確認する。
- 3と同様の手順でパッケージに
Test1
と入力し、 名前にTestCapsule
と入力し、完了
ボタンをクリックする。
-
Test1.java
とTestCapsule.java
が作成されれば成功。
5.記述例
Test1.java
package Test1;
public class Test1 {
public static void main(String[] args) {
// インスタンスの生成
TestCapsule tc = new TestCapsule();
// setterに値を入れる
tc.setHello("おはようございます");
// getterで入れた値の取得をする
System.out.println(tc.getHello());
}
}
TestCapsule.java
package Test1;
public class TestCapsule {
// インスタンス変数の定義
private String hello;
// コンストラクタ(インスタンス生成時に実行される)
public TestCapsule() {
this.hello = "Hello";
}
// setter
public void setHello(String hello) {
this.hello = hello;
}
// getter
public String getHello() {
return hello;
}
}
6.カプセル化をする理由
-
カプセル化
の狙いは「データを保護する
」ということです。 - もし、
カプセル化
をしなかった場合、データを改ざんすることが容易になります。
例:受験者名と受験者の点数を入力して合否判定を出すシステム
- 100点満点のテストで60点以上が合格です。
- 名前と点数を入力して合格か不合格かを判定します。
- 上記のようなシステムを作る際に
カプセル化
をしなかった場合、下記のコードように予期しない点数の変更が行えてしまう。
Test1.java
//受験者名と受験者の点数を管理するシステム
package Test1;
public class Test1 {
public static void main(String[] args) {
// インスタンスの生成
TestCapsule tc1 = new TestCapsule("A",50);
TestCapsule tc2 = new TestCapsule("B",60);
//予期しない変数の変更
tc1.score = 10000;
tc2.score = -100;
//合否の表示
tc1.Result();
tc2.Result();
}
}
TestCapsule.java
package Test1;
public class TestCapsule {
// インスタンス変数の定義
String name;
int score;
// コンストラクタ(インスタンス生成時に実行される)
public TestCapsule(String name, int score) {
this.name = name;
//不正な点数の入力対策
if(0 <= score && score <= 100) {
//0以上100以下
this.score = score;
}else {
//0未満または101以上
this.score = 0;
}
}
//合否判定メソッド
void Result() {
if(60 <= score) {
//合格
System.out.println(name+"さんは"+score+"点で合格です。");
}else {
//不合格
System.out.println(name+"さんは"+score+"点で不合格です。");
}
}
}
-
上記の文をコピーして、先ほど作成した
Test1.java
,TestCapsule.java
に上書き保存し、実行するとこうなります。↓↓
-
上記の例では、100点満点のテストなため、
10000点
も-100点
も存在しない。 -
カプセル化
は直接データの操作をさせずに、一度関数を通す状況を作ることで不正なデータ操作を防ぐ
役割を持っている。 -
上記の例の
TestCapsule.java
をカプセル化
すると以下のようになる。
Test1.java
//受験者名と受験者の点数を管理するシステム
package Test1;
public class Test1 {
public static void main(String[] args) {
// インスタンスの生成
TestCapsule tc1 = new TestCapsule("A",50);
TestCapsule tc2 = new TestCapsule("B",60);
//予期しない変数の変更
tc1.setScore(10000);
tc2.setScore(-100);
//合否の表示
tc1.Result();
tc2.Result();
}
}
TestCapsule.java
package Test1;
public class TestCapsule {
// インスタンス変数の定義
private String name;
private int score;
// setter
public void setName(String name) {
this.name = name;
}
// getter
public String getName() {
return name;
}
// setter
public void setScore(int score) {
//不正な点数の入力対策
if(0 <= score && score <= 100) {
//0以上100以下
this.score = score;
}
}
// getter
public int getScore() {
return score;
}
// コンストラクタ(インスタンス生成時に実行される)
public TestCapsule(String name, int score) {
this.name = name;
//不正な点数の入力対策
if(0 <= score && score <= 100) {
//0以上100以下
this.score = score;
}else {
//0未満または101以上
this.score = 0;
}
}
//合否判定メソッド
void Result() {
if(60 <= score) {
//合格
System.out.println(name+"さんは"+score+"点で合格です。");
}else {
//不合格
System.out.println(name+"さんは"+score+"点で不合格です。");
}
}
}
7.GitHub
GitHubにソースコードを公開しています。