見出し画像

【Javaお勉強日記】publicとprivateとstaticと

クラス作る時やらメソッド作る時やらにごにょごにょくっついてくるあの辺の仕組みと働きと使い方を整理します。

private か public か

「誰がその情報を使えるか」をコントロールするのがprivate/public(アクセス修飾子と呼ぶ)

// ↓これとか
public class Hoge{
    // ↓これとか
    public static void main(){ ... }
}

の、あちこちに出てくるpublicとprivateのこと。

・「自分自身からしか呼び出せない変数やメソッド」にしたいものはprivate
・「他のパッケージやクラスからも呼び出せるようにしたいやつ」はpublic
・明示しないと暗黙的に「自分の属するパッケージからは参照できる」という状態になる(デフォルトアクセス/パッケージアクセス)
よっぽどどうしてもこの制限を適用する必要があるとき以外、明示する。
・classそのものはprivateにできない(よそから呼べないクラスじゃ意味が無いので)
・メソッドは極力privateにしたい。最終的に外から使う必要のあるメソッドだけpublicにする。フィールド変数も基本private(getter、setterを介して取得・変更する)。(何なら必要に応じてコンストラクタもprivateにできる、けどその話は追々)=情報をカプセル化する

「情報のカプセル化」のメリット

例えば

3桁の商品コードを受け取り、データベースを検索して、商品の名前を返す

という仕事が必要なので、

・商品コードを受け取って、商品コードが3桁か判断するメソッド
・データベースを検索して商品の名前を取得して返すメソッド

の二つを用意していたとする。

この両方をpublicにして、「商品コードチェックメソッドを通してからデータベース検索をしてください」という仕様にしていたとすると、絶対

・「ココには絶対3桁しか入ってこないし~」ってチェックメソッド使わずにデータベース検索だけ使い始めるやつ
・データベース検索はしないのにチェックメソッドだけ転用するやつ

が出てきて、いざ「商品コード、3桁だったけど今後は3桁-3桁の形式になりまーす!でも今までの商品は3桁で運用しまーす!」って地獄みたいな変更がでた場合に、チェックメソッドも検索メソッドも改修したにもかかわらず、

・検索だけ使ってたやつ「なんか突然動かなくなったんだけど!!」
(そりゃチェックメソッド通してないからなぁ!)
・チェックだけ使ってたやつ「なんか突然動かなくなったんだけど!!」
(そりゃ「3桁かをチェックする」メソッドじゃなくなったからなぁ!)

……ってなる未来が目に見えている。

なので、「商品コードを与えると商品名を返す」メソッドだけをpublicにしておいて、残りの「商品コードが正しいかチェックする」「データベースを検索する」メソッドは別に作って、privateにしておく。
そうすれば、想定外の使い方をされて変更が難しくなることがない。(理論上は)

こうやって必要以上の情報を公開しないようにすることを「データ(情報)隠蔽」と呼ぶ。一般的に隠蔽っていうとイメージ悪いけど、この場合は隠蔽性が高い方が変更に強くて良いプログラムになる。


static か そうじゃない か

staticは「静的」って意味で、これを付けた変数やメソッドは、プログラムの開始時にメモリ上にコピーされる。

一方、staticを付けない変数やメソッドは、newを使ってインスタンスを作ったときにメモリ上に実体が出来る。

(体感的には、VBAで標準モジュールに書く(static/いつでも使える)のとクラスモジュールに書く(staticじゃない/インスタンス作らないと使えない)のの違いみたいな感じ)

・static付けたメンバのことをスタティックメンバとか静的メンバとかクラスメンバとか言う(けど、pythonのクラス変数とは意味が違うので注意する)
・static付いて無いメンバはインスタンスメンバと呼ぶ(けど、こいつもpythonのインスタンス変数とは意味が違うので注意)(本質的には同じ事のような気もするけど)
・スタティックメンバだけのクラスは、インスタンスを作らなくても実行できる
・オブジェクトのデザイン用に使うクラスは、インスタンスメンバだけ
・クラスそのものを作る時にはstaticは付けない(が、「プログラム中で呼べば使える」ってことは本質的に全部staticなんだろうな…)
-↓この辺は使いどころがまだよくわからない↓-
・インスタンスメンバとスタティックメンバが混在するクラスがあっても大丈夫。(プログラムの開始時にはスタティックメンバだけがメモリにコピーされ、インスタンスを作る時にはスタティックメンバは無視される)
・あるクラスのスタティックメンバであるmainメソッドが、自身のインスタンスを作ることもできる

というわけで情報のカプセルかについてと、スタティックメンバとインスタンスメンバの使い分けについてをまとめました。今日はまだまだやるよ。

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