第7日目:アクセス指定子

Javaのアクセス制御とカプセル化の基礎を学びます。アクセス指定子、コンストラクタ、セッター・ゲッターを確認します。

日付 0 1 2 3 4 5 6 7

第7日目:アクセス指定子

アクセス指定子

アクセス指定子とは

第6日目では、クラスのフィールドやメソッドに対して外部から自由にアクセスしていました。しかし、実際のプログラム開発では、クラスの内部のデータや処理を外部から勝手に変更されないよう、アクセスを制限したい場合があります。

Javaでは、フィールドやメソッドの先頭にアクセス指定子をつけることで、そのメンバへのアクセス範囲を制御することができます。Javaで使用できる主なアクセス指定子は以下の表7-1のとおりです。

表7-1:Javaのアクセス指定子
アクセス指定子呼び名意味
publicパブリックどこからでも呼び出せる
(なし)デフォルト同じパッケージ内からしか呼び出せない
protectedプロテクティッド同じパッケージか、そのサブクラスからしか呼び出せない
privateプライベート同じクラス内からしか呼び出せない

コンストラクタ

コンストラクタとは

コンストラクタとは、インスタンスを生成したときに自動的に呼び出される特殊なメソッドです。コンストラクタの名前はクラス名と同じで、戻り値の型は記述しません。コンストラクタには引数を持たせることもでき、インスタンス生成時に初期値を設定するために使用されます。

コンストラクタの書き方
クラス名(引数の型 引数名){
  処理
}

サンプルプログラム

以下のサンプルでは、SampleClass02にコンストラクタとアクセス指定子を定義し、Sample701から利用しています。

SampleClass02.java
package day7;

public class SampleClass02 {
    public SampleClass02(){
        System.out.println("コンストラクタ");
    }
    private void method1(){
        System.out.println("method1(private)");
    }
    public void method2(){
        System.out.println("method2(public)");
    }
    public void method3(){
        method1();
        System.out.println("method3(public) : num=" + this.num);
    }
    private int num = 1;
}
Sample701.java
package day7;

public class Sample701 {
    public static void main(String[] args) {
        SampleClass02 s = new SampleClass02();
        s.method2();
        s.method3();
    }
}
コンストラクタ
method2(public)
method1(private)
method3(public) : num=1

インスタンスを生成した際に、コンストラクタが自動的に呼び出され「コンストラクタ」が表示されます。method1()はprivateのため、Sample701から直接呼び出すことはできませんが、同じクラス内のmethod3()からは呼び出すことができます。

カプセル化

カプセル化とは

フィールドをprivateにして外部から直接アクセスできないようにし、専用のメソッドを通じてのみアクセスできるようにする設計手法をカプセル化と言います。カプセル化はJavaプログラミングの標準的な設計手法であり、データを保護し、クラス内部の実装を変更しやすくするという利点があります。

セッター・ゲッター

セッターとゲッターとは

privateなフィールドへのアクセスを提供するために使用されるメソッドがセッター(setter)とゲッター(getter)です。セッターはフィールドに値を書き込むメソッド、ゲッターはフィールドの値を読み出すメソッドです。

  • セッター:set + フィールド名の先頭を大文字にしたもの(例:setNumber)
  • ゲッター:get + フィールド名の先頭を大文字にしたもの(例:getNumber)
表7-2:セッターとゲッター
フィールド名セッターゲッター
numbervoid setNumber(int number)int getNumber()
str—String getStr()
セッターとゲッター

図7-1:セッターとゲッター

サンプルプログラム

以下のサンプルでは、SampleClass03にprivateフィールドとコンストラクタ、セッター・ゲッターを定義し、Sample702から利用しています。

SampleClass03.java
package day7;

public class SampleClass03 {
    private int number = 0;
    private String str = "";
    public SampleClass03(String str){
        this.str = str;
    }
    public void setNumber(int number){
        this.number = number;
    }
    public int getNumber(){
        return this.number;
    }
    public String getStr(){
        return this.str;
    }
}
Sample702.java
package day7;

public class Sample702 {
    public static void main(String[] args) {
        SampleClass03 s = new SampleClass03("HelloWorld.");
        s.setNumber(100);
        System.out.println(s.getNumber());
        System.out.println(s.getStr());
    }
}
100
HelloWorld.

SampleClass03のフィールドnumberとstrはprivateのため、外部から直接アクセスすることができません。コンストラクタでstrの初期値を設定し、setNumber()でnumberに値を代入し、getNumber()とgetStr()でそれぞれの値を取得しています。

デフォルトコンストラクタ

デフォルトコンストラクタとは

第6日目のSampleClass01には、コンストラクタが定義されていませんでした。しかし、Sample601でインスタンスを生成することができました。これは、コンストラクタが定義されていない場合、Javaが自動的にデフォルトコンストラクタを用意するためです。

デフォルトコンストラクタは、何も処理を行わないコンストラクタで、プログラマには見えないところで自動的に定義されます。(図7-2)

Javaのデフォルトコンストラクタ

図7-2:Javaのデフォルトコンストラクタ

ただし、引数ありのコンストラクタを明示的に定義した場合(SampleClass03のように)は、デフォルトコンストラクタは自動的には作られません。その場合、引数なしでインスタンスを生成しようとするとエラーになります。

練習問題 7 へ →