今回はstaticについて記載しようと思います。特に、static変数とstaticメソッドについて解説します。
static変数
static変数とは、クラスをインスタンス化せずにその変数にアクセスすることができる変数です。
static変数はクラス名.static変数
のように記述しますのでクラス変数、非static変数はインスタンス名.変数のように記述しますのでインスタンス変数とも呼ばれます。
クラス変数はそのクラスから作られたインスタンスの全てで共有される変数、インスタンス変数はそのインスタンス1個内だけで使われる変数となります。
例えば、Javaでの例を下記に記載します。 まず、下記のようなクラスがあるとします。messageはstatic変数です。
public class MessageText { public static String message; // static変数 public void echoMessage () { System.out.println(message); } }
message変数は、各インスタンスではなくMessageTextクラス上に定義されるため、jvmプロセス上にたった1つしか存在しない。
以下のmain文で実行してみると、2つのインスタンスが同じメモリ上の値を参照しているのがわかると思います。
public static void main (String[] args) { MessageText.message = "メッセージ1"; MessageText message1 = new MessageText(); MessageText message2 = new MessageText(); message1.echoMessage(); // メッセージ1が出力される message2.echoMessage(); // メッセージ1が出力される MessageText.message = "メッセージ2"; message1.echoMessage(); // メッセージ2が出力される message2.echoMessage(); // メッセージ2が出力される }
static変数の使い所は定数
とクラス内でのみ使用される共用変数
が考えられます。定数の場合にはfinal修飾子をつけて上書きできないようにします。
クラス内でのみ使用される共用変数はアクセス修飾子をprivateにして、そのクラス内からのみ参照・更新できないようにアクセスレベルを制限します。
今回はJavaで補足しましたが、他のプログラミング言語でもstaticの概念があればあまり差はないと思います。
staticメソッド
次はstaticメソッドについてです。
staticメソッドはクラスに直接属し、クラスが実行するメソッドです。 インスタンスに属し、インスタンスが実行するインスタンスメソッドとは異なります。
staticメソッドを呼び出すには、原則としてクラス名.staticメソッド名
と指定します。
staticメソッドの特徴は下記3点です。
①インスタンスを生成せずに呼び出せます。頻繁に呼び出されるユーティリティメソッドはよくstaticメソッドとして実装されます。
②インスタンスを複数生成しても、そのインスタンスが持つstaticメソッドの処理はどのインスタンスも同じ動作になります。 なので、SwiftでのExtensionに使われたりします。
③インスタンス化しないと状態を持てないので、状態に依存しないことを保証できます。 具体的には、 与えられた引数のみでメソッドの挙動が決まることが保証できます。
staticメソッドにする場合には副作用のない、純数な関数であること。 つまり、関数の出力値が入力値によってのみ決まる関数にした方がよさそうです。
注意点としてはstaticメソッドではstatic変数しか扱えないです。
public class Test { String name; Static int age; public static void setAge() { Test.age = 20; System.out.println(this.name + "です"); } }
上記の例では、this.nameが参照できないのでエラーになります。
終わりに
static変数とstaticメソッドについて解説しました。
static変数は定数として使用できるかと思いますが、staticメソッドはオブジェクト指向から外れる処理になる気がするので、 共通処理で使用するくらいかなと思います。