Javaでよく使う考え方の一つにカプセル化があります。しかし、Javaの初学者にとっては理解しにくい考え方です。今回は、そんなJavaのカプセル化についてご紹介します!

最後にJavaの練習問題もつけてるから、挑戦してみてや!
👇動画の方が学習しやすい人はこちらのJavaの講座がオススメです!
記事の信頼性:現在受託系のIT企業で働いている「しう」がJavaのカプセル化について解説します。
カプセル化とは【Java】


カプセル化はフィールドへの読み書きを制限する機能のことです!
他にもメソッドの呼び出しを制限できます。この後に解説をしていきますが、privateという修飾子を使ってカプセル化の利用をしていきます。同じクラスからの呼び出しはできますが、他のクラスからの呼び出しができなくなります。初めてカプセル化を学ぶ人は、最初は制限をすることで何かメリットがあるんだな程度の理解でもいいでしょう。



なんで、わざわざ制限をかけたりするん?



一郎君もお金を預けてる銀行口座があるやろ?



その銀行口座から誰でも好き勝手にお金を引き出せたら嫌やないか?



そんな銀行にお金預けられないってw
中の大切な情報を守るためにアクセス制限(誰に何を許すか制限する)が必要なのです。
Javaでカプセル化をする方法【練習問題】


Javaでカプセル化をする方法をご紹介します!!
Javaでのカプセル化には2つの手順があります。以下の順で解説をしていきます。
- 手順①:privateで修飾
- 手順②:getterとsetterを用意する
privateで修飾【Javaでカプセル化】
Javaでのカプセル化の手順①:privateで修飾
次のようなHeroクラスがあるとします。この時点ではまだカプセル化をおこなっていません。
public class Hero{
String name;
public int hp;
}
この場合、他のクラスでHeroクラスのフィールド(hpやmp)を自由に操作できてしまいます。例を出すと次のようにmainメソッドでHero.hpの値を自由に変更できます。
public static void main(String[] args ){
Hero hero = new Hero();
hero.hp = 100;
}
もし、このHeroクラスのフィールド(hpやmp)をJavaでカプセル化をするにはどのように変更すればよいでしょうか?ある修飾子を使用する(Stringの前につける)ことでカプセル化をすることができます。
カプセル化で利用する修飾子はprivateになります!Heroクラスを次のように変更しましょう。(String nameの前にprivateを、int hpの前のpublic をprivateに変更しています。)
public class Hero{
//publicをprivateに変更
private String name;
private int hp;
}
これでJavaでのカプセル化の手順①が終了です。しかし、このままではmainメソッドで自由に操作できていたHero.hpが操作できなくなります。(実際に他のクラスに書いている先ほどのmainメソッドを利用するとエラーが発生します。同じクラスにコードを書いている場合はエラーは起きません)そこで、次にgetterとsetterを使った手順を見ていきましょう。
getterとsetter【カプセル化に必須】
Javaでのカプセル化の手順②:getterとsetterを用意する
getterとsetterについてご紹介します! 先ほどのHeroクラスを次のように変更しましょう。(5行目からgetter・setterの追加をおこなっています)
public class Hero{
private String name;
private int hp;
//getterの追加
public String getName(){
return this.name;
}
//setterの追加
public void setName(String name){
this.name = name;
}
//getterの追加
public int getHp(){
return this.hp;
}
//setterの追加
public void setHp(int hp){
this.hp = hp;
}
}
6行目にあるgetterのgetName()では、this.nameで2行目のフィールドの値(name)を取得しています。11行目にあるsetterのsetName()では、このメソッドを利用することでHeroクラスのフィールドの値(name)を変更することができます。getterとsetterは書き方が決まっているので覚えておきましょう。(慣れたら少し工夫をすることもできます)
このようにすることで、mainクラスでもエラーが発生せずに利用することができます。3行目ではheroのフィールドの値(hp)を100にしています。また、5行目ではhero.getHp()とgetterを利用して、heroのフィールドの値(hp)を取得しています。
public static void main(String[] args ){
Hero hero = new Hero();
hero.setHp(100);
//ヒーローのHPは100ですと表示
System.out.println(“ヒーローのHPは” + hero.getHp() + “です”);
}
getterとsetterでカプセル化したフィールドに値を代入したりできます。統合開発環境(IDE)のEclipseやIntelli Jでは簡単にカプセル化する方法もあります。



ちなみに、後半にJavaのカプセル化の練習問題を載せてるねん。



練習問題を使って、理解できてるか確認してみてや!
Javaでカプセル化をするメリット





カプセル化の使い方の勉強をしたけど、Javaでのカプセル化のメリットって何なん?



たしかにメリットも知りたいやんな。カプセル化のメリットも見ていこか!
カプセル化のメリットは2つあります。次の順番でJavaのカプセル化のメリットをお伝えします。
- 保守性が高くなる【カプセル化で変更に強く】
- フィールドへのアクセスを検査できる
保守性が高くなる【カプセル化で変更に強く】
カプセル化のメリットは保守性が高くなることです!
保守性とは、メンテナンスや修理のしやすさのことです。例えば、案件によっては改修作業などでフィールドの名前を変更することがあります。その時に、改修箇所が影響を与えている場所を探してすべて変更するのは大変ですよね。(実際の開発現場では数千~数万行のコードがあったりします。)
しかし、カプセル化をしておけば、変更箇所が少なくて済みます。先ほどのHeroクラスで言えばhpを200にしたい時、setterで設定する値を200に変更するだけでgetHpで取得する値はすべて200に変わります。下に例も示しておきます。
public static void main(String[] args ){
Hero hero = new Hero();
hero.setHp(200);
//ヒーローのHPは200ですと表示
System.out.println(“ヒーローのHPは” + hero.getHp() + “です”);
}
フィールドへのアクセスを検査できる
カプセル化のメリットとして、getterとsetterに条件を付けることができます!
setterでhero.hpに値をつける時に0より大きい値だけ入れたいとします。その場合、次のようにif文で「0より大きいとき」だけsetterが動くようにすればいいのです。(19行目の部分)
public class Hero{
private String name;
private int hp;
public String getName(){
return this.name();
}
public void setName(String name){
this.name = name;
}
public int getHp(){
return this.hp();
}
public void setHp(int hp){
//ここでhp>0の条件をつけている
if(hp > 0){
this.hp = hp;
}
}
これもJavaでカプセル化をおこなうメリットになります。カプセル化を利用しない場合は、hpの値を-500にしても0にしてもエラーが発生することはありません。しかし、このようにsetteで 「hp>0」 という条件をつけることによってhpが0より大きいときだけhpの値が変更されるようになります。
カプセル化・練習問題


次のクラスをカプセル化してみてください。簡単な練習問題ですが、自分が学んだことが活用できているか確認することも大切です。
public class Car(){
public String name;
public double speed;
}
インプットした後に練習問題などでアウトプットすることが上達への近道です。最後に練習問題の答えも書いているので、あっているか確認してみてくださいね。
まとめ
いかがでしたか?今回は以下の順番でJavaのカプセル化について紹介しました。
- カプセル化とは【Java】
- Javaでカプセル化をする方法
- Javaでカプセル化をするメリット
- カプセル化・練習問題
Javaにおいてカプセル化の考え方は実務でもよく使います。復習をすることで身に付けていけるといいですね。もし、Javaをもっと勉強したいという場合は、こちらで参考書やUdemyオススメの動画の紹介もしています。体系的に勉強するなら参考書やUdemyでの動画で学習することがおすすめです!
👇Javaの参考書の選び方・おすすめの参考書リスト【初心者必見!】


👇Java初心者にオススメのUdemy講座
カプセル化・練習問題【答え】


先ほどのJavaでのカプセル化の練習問題の答えを載せておきます。練習問題を通じて理解できてるか確認してくださいね。
public class Car(){
private String name;
private double speed;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public double getSpeed(){
return this.speed;
}
public void setSpeed(double speed){
this.speed = speed;
}
}
☟あわせて読みたい 「しう」のオススメブログ






コメント