この記事は、シアトルコンサルティング株式会社 Advent Calendar 2021の5日目の記事です。
こんにちは、シアトルコンサルティングの小泉です。
##はじめに
今回はプログラミングを学び始めた際に苦戦したアクセス制御についてまとめました。
プログラミング初学者の方に向け作成いたしましたので、アクセス制御について知りたい方はぜひ活用してみてください。
##ゴール
アクセス修飾子の役割と使用場面を理解できるようになる。
フィールドとメソッドに対するアクセス制御
Javaでは、それぞれのフィールド及びメソッドに対してアクセス制御を行うことができます。
以下の4段階からアクセス制御のレベルを選ぶような仕組みになっています。
制限のレベル | 名称 | 指定方法 | アクセスを許可する範囲 |
---|---|---|---|
制限が厳しい | private | private | 自分自身のクラスのみ |
⬆︎ | package private | なし(何も書かない) | 自分と同じパッケージに属するクラス |
⬇︎ | protected | protected | 自分と同じパッケージに属するか、自分を継承した子クラス |
制限が緩い | public | public | 全てのクラス |
注意点:クラスのアクセス制御とメソッド及びフィールドのアクセス制御のうち、制約が厳しい方を優先させます
使用例(publicとprivate)
今回はよく使われるpublicとprivateの使用例について説明します。
publicという修飾子は、それを付けた要素 (クラス、フィールド、メソッド、コンストラクタ) の可視性を決定するものです。public は「公開の」という意味を持つように、public を付けた要素はどこからでも (全てのクラスから) 参照することができます。
それに対して、private という修飾子があります。これはフィールド、メソッド、コンストラクタに付けられるものでありますが、これを付けた要素は他のクラスから参照できなくなります。
例えば、次のようなクラスを考えます。
public class Rectangle {
private double width;
private double height;
public Rectangle(double w, double h) {
this.width = w;
this.height = h;
}
public double area() {
return this.width * this.height;
}
}
上記のようなクラスを作った際には、public のついているコンストラクタ、area メソッドには他のクラスからでもアクセスできます。
// 他のクラス
public class RectangleAction1 {
public static void main(String[] args) {
Rectangle r = new Rectangle(1.0, 2.0);
// --OK
System.out.println("area = " + r.area());
// --OK
}
}
ただし、private のついているフィールド double、height には他のクラスからはアクセスできません。
// 他のクラス
public class RectangleAction2 {
public static void main(String[] args) {
Rectangle r = new Rectangle(1.0, 2.0);
// --OK
// private なのでどちらもコンパイルエラー
r.width = 3.0;
r.height = 4.0
System.out.println("area = " + r.area());
// --OK
}
}
このように private を使用すると、「書き換えてほしくない情報を書き換えられないで済む」という利点があります。また、間違えて書き換えようとしてもコンパイルエラーとなるので、わざわざ実行しなくてもプログラムミスであることが分かります。
privateは同じクラスからならば読み出すことも書き換えることができます。
public class Rectangle {
private double width;
private double height;
public Rectangle(double w, double h) {
// 自分のクラスからは書き込めます
this.width = w;
this.height = h;
}
public double area() {
// 自分のクラスからは読み出せます
return this.width * this.height;
}
}
##さいごに
アクセス制御について理解することで悪意や間違いによる利用を防止することができます。
開発を行う上では必要な知識になると思うので、この記事が皆様の手助けになれば幸いです。