見出し画像

Javaの基礎を抑えたい#7【アクセス指定子とカプセル化】

基礎編の最後となる今回は、前回学んだクラス及びフィールド、メソッドの応用となるアクセス指定子とカプセル化を学んでいきたいと思います。

アクセス指定子とは

Javaには、クラスやフィールド、メソッドといったものが存在することを学習しましたが、このフィールド及びメソッドはアクセス許可を指定し、そのオブジェクトにアクセスできる範囲を指定することができます。それがアクセス指定子と呼ばれるものです。

これまで実際にJavaのプログラムを何個も見てきましたが、既にアクセス指定子は登場していました。

package day7;
 
public class SampleClass02 {
 
    //  コンストラクタ
    public SampleClass02(){
        System.out.println("コンストラクタ");
    }
    //  privateメソッド
    private void method1(){
        System.out.println("method1(private)");
    }
    //  publicメソッド①
    public void method2(){
        System.out.println("method2(public)");
    }
    //  publicメソッド②
    public void method3(){
        //  privateメソッドの呼び出し
        method1();
        System.out.println("method3(public) : num=" + this.num);
    }
    //  privateフィールド
    private int num = 1;
 

各メソッドの先頭についているpublicprivateはアクセス修飾子と呼ばれ、これらがアクセスの制限を行なっています。
上記以外にもアクセス修飾子にどんな種類があるか見ていきます。

・pablic(パブリック)
どこからでもそのメソッドを呼び出すことが可能
・default(デフォルト)
アクセス指定子が省略されている場合。同パッケージ内のみ呼び出しが可能
・pritected(プロテクティッド)
同パッケージか、そのサブクラスからのみ呼び出しが可能
・private(プライベート)
同じクラス内からのみ呼び出し可能

そのため、先ほどのプログラムを呼び出そうとした場合、実行結果は以下のようになります。

package day7;
 
public class Sample701 {
 
    public static void main(String[] args) {
        SampleClass02 s = new SampleClass02();
        //  method1()は、privateなので、外部からはアクセスできない。
        //s.method1();
        //  method2呼び出し
        s.method2();
        //  method3呼び出し
        s.method3();
        //numは、privateフィールドなので、外部からはアクセスできない。
        //s.num = 1;
    }
 
}
# => 実行結果
# コンストラクタ
#  method2(public)
# method1(private)
# method3(public) : num=1

こういった呼び出しを制限する系の記述を見ると、JSのvarやconstや、Rubyでもあるprivateメソッドをイメージしますが、使用する用途としては、varやconstに近いのかなと思いました。第三者からの可読性を高めたり、不要な呼び出しや処理を避けること目的としたプログラムを作り上げることに近いのかなと思いました。
この辺りは、実際にコードを書きながら感覚を掴んでいきたいと思います。

コンストラクタ

先ほどのプログラムで以下のような記述がありました。

SampleClass02 s = new SampleClass02();

クラス名と同じ名前のメソッドを指す言葉をコンストラクタと言います。
コンストラクタの特徴は、①戻り値の指定がないこと。②インスタンス生成時に一度だけ呼び出されるという点です。
戻り値の指定がないことなどは、voidと似ていますね。

セッターとゲッター

privateなどで外部からのアクセスを制限されたフィールドに値を書き込むメソッドをセッター、値を取得するメソッドをゲッターといいます。

package day7;
 
public class SampleClass03 {
    //  int型のフィールド(privateで隠ぺいされている)
    private int number = 0;
    //  String型のフィールド(privateで隠されている)
    private String str = "";
    //  コンストラクタ(引数つき)
    public SampleClass03(String str){
        this.str = str;
    }
    //  number変数のセッター
    public void setNumber(int number){
        this.number = number;
    }
    //  number変数のゲッター
    public int getNumber(){
        return this.number;
    }
    //  str変数のゲッター
    public String getStr(){
        return this.str;
    }
 
}

これを使うことで、外部からアクセスができないprivate内の値を変更、取得することが可能です。

引数付きのコンストラクタ

//  コンストラクタ(引数つき)
    public SampleClass03(String str){
    this.str = str;

//  呼び出し
         SampleClass03 s = new SampleClass03("HelloWorld.");

先ほど説明したコンストラクタには引数を付けることが可能です。
これを呼び出すときは、newを宣言するときに引数を与えます。引数をつけていないと未定義となるため、エラーが表示されます。


ここまで、Javaの基礎的な用語や処理実行の仕方を8回にわたって学習してきました。RubyやJsと似ている点、異なっている点を見つけながら、なんとなくですが理解を深められたと思います!
いまの状態は、言語についての理解はあるけれど、これを実際に動かすときや処理に昇華させることが難しいという感じです。
なので、これらを活用して、これから実際にプログラムを作成することで更に理解を深めていきたいと思います!

ここまで読んでいただきありがとうございました!

この記事が気に入ったらサポートをしてみませんか?