インスタンスとクラス

もうプログラミングを始めて半年も経つのに、インスタンスメソッドとクラスメソッドの
概念が結構あやふやです。なので、本とか読んで自分なりにわかったことをこの機会にま
とめておこうと思います。

インスタンスフィールドとクラスフィールド

インスタンスフィールド

フィールドはクラスが持つ変数。
インスタンスを生成すると、そのフィールドはインスタンス単位で発行されます。
なので、インスタンスAとインスタンスBのフィールドは同じ名前でも全く関連が
ありません。また、『this.フィールド名』と書くと、今生成したインスタンス
フィールドという意味になります。


クラスフィールド

クラスフィールドはstaticが付いたフィールド。
つまり静的フィールドなので、インスタンスにごとに生成されるフィールドではなく、
そのクラスにたった一つしかないフィールドです。
『this.フィールド名』と書くとコンパイルエラーになります。
なぜなら、thisはインスタンス自体を示しているので、クラスフィールドを示して
いることにならないからです。

このフィールドはインスタンスごとに初期化されては困るような、また、クラスの
中で保持しておきたいデータなどに用いるみたいです。

ゲームで例えるなら、

今生きているプレイヤーの人数を保持するのがクラスフィールド(インスタンス全体を把握)
今のプレイヤーが生きているかどうかを保持するのがインスタンスフィールド(個々のインスタンスを把握)

もし生きているプレイヤーの人数を保持するフィールドがクラスフィールドでなく、インスタンスフィールドだったら、
インスタンスを生成する度に初期化されてしまうので、ずっと初期値と変わらない状態になります。

インスタンスメソッドとクラスメソッド


インスタンスメソッド

概念としては、インスタンスフィールドと一緒です。
現在のインスタンスの状態を調べたり、現在のインスタンスに対して処理を行ったりするメソッド
(つまり、インスタンスフィールドを使って計算を行うメソッド)のことを言います。


クラスメソッド

staticが付いたメソッドです。
そのクラス変数(フィールド)に対して計算や処理を行ったり、そのクラスのインスタンスの中から
ある特定のインスタンスを見つけ出すメソッドのことを言います。



わたしの中で、概念的なものはわかっているのですが、実際に自分で使い分けろと言われても
どういう時に使い分けたらいいのかがわからないのでパッとしません。。。。
会社の先輩が書いたソースをみると、共通処理をクラスメソッドにしています。
でも、共通処理でもクラスメソッドにできないものもあるみたいで・・・・・。
その違いは未だよくわからず。。。。
完全に理解するには、まだまだ勉強が必要です(>_<)