MENU
👇しうが厳選・おすすめのブログ!
しう
【テニス好きブロガー】 
テニス、読書が好きです。IT企業で学んだこともブログに書いています。高校教諭(テニス部顧問)→IT企業。テニス歴12年。人生をより有意義なものにしたいと思い、ブログを書き始めました。Twitterもしています。
アーカイブ

Javaでカプセル化・練習問題付き【しうの備忘録】

Java カプセル化 練習問題

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

しう

最後にJavaの練習問題もつけてるから、挑戦してみてや!

 

👇動画の方が学習しやすい人はこちらのJavaの講座がオススメです!

 

記事の信頼性:現在受託系のIT企業で働いている「しう」がJavaのカプセル化について解説します。

目次

カプセル化とは【Java】

Java カプセル化 練習問題

カプセル化はフィールドへの読み書きを制限する機能のことです!

 

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

 

PC好きな一郎君

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

しう

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

 

しう

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

PC好きな一郎君

そんな銀行にお金預けられないってw

 

中の大切な情報を守るためにアクセス制限(誰に何を許すか制限する)が必要なのです。

Javaでカプセル化をする方法【練習問題】

Java カプセル化 練習問題

Javaでカプセル化をする方法をご紹介します!!

 

Javaでのカプセル化には2つの手順があります。以下の順で解説をしていきます。

  1. 手順①:privateで修飾
  2. 手順②: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 カプセル化 練習問題
PC好きな一郎君

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

しう

たしかにメリットも知りたいやんな。カプセル化のメリットも見ていこか!

 

カプセル化のメリットは2つあります。次の順番でJavaのカプセル化のメリットをお伝えします。

  1. 保守性が高くなる【カプセル化で変更に強く】
  2. フィールドへのアクセスを検査できる

保守性が高くなる【カプセル化で変更に強く】

カプセル化のメリットは保守性が高くなることです!

 

保守性とは、メンテナンスや修理のしやすさのことです。例えば、案件によっては改修作業などでフィールドの名前を変更することがあります。その時に、改修箇所が影響を与えている場所を探してすべて変更するのは大変ですよね。(実際の開発現場では数千~数万行のコードがあったりします。)

しかし、カプセル化をしておけば、変更箇所が少なくて済みます。先ほどの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の値が変更されるようになります。

カプセル化・練習問題

Java カプセル化 練習問題

次のクラスをカプセル化してみてください。簡単な練習問題ですが、自分が学んだことが活用できているか確認することも大切です。

public class Car(){
 public String name;
 public double speed;
}

 

インプットした後に練習問題などでアウトプットすることが上達への近道です。最後に練習問題の答えも書いているので、あっているか確認してみてくださいね。

まとめ

いかがでしたか?今回は以下の順番でJavaのカプセル化について紹介しました。

  1. カプセル化とは【Java】
  2. Javaでカプセル化をする方法
  3. Javaでカプセル化をするメリット
  4. カプセル化・練習問題

 

Javaにおいてカプセル化の考え方は実務でもよく使います。復習をすることで身に付けていけるといいですね。もし、Javaをもっと勉強したいという場合は、こちらで参考書やUdemyオススメの動画の紹介もしています。体系的に勉強するなら参考書やUdemyでの動画で学習することがおすすめです!

 

👇Javaの参考書の選び方・おすすめの参考書リスト【初心者必見!】

あわせて読みたい
【Java初心者向け】必読の書籍・エンジニア志望なら見ておきたい! プログラミング初心者がJavaを勉強するときに、何を見て勉強するでしょうか?   学習サイト、書籍、Youtubeなどの動画。 今の時代、学び方の選択肢はとても多いです。 ...

 

👇Java初心者にオススメのUdemy講座

カプセル化・練習問題【答え】

Java カプセル化 練習問題

先ほどの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;
  }
}

 

解答・解説に間違いがあれば、お手数ですが下にあるコメントもしくはtwitterよりご連絡ください。

 

☟あわせて読みたい 「しう」のオススメブログ

あわせて読みたい
JavaでFizzBuzz!!!【元教師が解説します】 Javaの勉強で力試しとなる問題がFizzBuzz問題です。   このFizzBuzz問題ではプログラミング初心者が、Javaでifやwhileを理解しているか確認することができます。 今回...
あわせて読みたい
プログラミング練習問題集【Java】 まとめ プログラミング(Java)の勉強をしていると、コーディングの練習もしたくなりますよね。   実際に自分で決めた動きをプログラミングで再現できると、技術力が向上しま...
あわせて読みたい
Java 配列 ArrayList HashMap まとめ Javaには、複数のデータを格納できる仕組みがあります。 それは、配列、ArrayList、HashMapと呼ばれています。   それぞれに便利な役割があるので、この記事でお伝えし...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

【しう】
Java Engineer| 「テニスとJava(プログラミング)のお悩み解決ラボ」運営者| プログラミングとテニス、開発現場の学びを発信|【経歴】関関同立➪高校教師➪受託系IT企業| 開発現場でSEとPGの下積み中| ∮保有資格∮ : Java Silver,基本情報

コメント

コメントする

CAPTCHA


目次