Javaの「static変数」と「インスタンス変数」は何が違う?新人エンジニアのためのやさしい解説
こんにちは。ゆうせいです。
今回は、Javaのクラス設計でよく出てくる 「static変数」とインスタンス変数の違い」 について、まったくの初心者でもわかるように、丁寧に説明していきます。
そもそも「変数」って何だっけ?
まずは前提から。
変数とは、データを一時的に保存しておくための箱のようなものです。Javaではクラスの中にこの変数を置くことで、「そのクラスが持つ情報」を表現できます。
でも、その変数には2種類あるんです。それが、
- インスタンス変数
- static変数(クラス変数とも言います)
です。
では、この2つはなにがどう違うのでしょう?
インスタンス変数とは?
インスタンスごとに異なる値を持つ変数
インスタンス変数とは、newして作られたオブジェクトごとに用意される変数のことです。
例を見てみましょう:
public class Dog {
String name;
}
このクラスから2匹の犬を作ると…
Dog dog1 = new Dog();
dog1.name = "ポチ";
Dog dog2 = new Dog();
dog2.name = "コロ";
dog1.name
とdog2.name
は別々の値を持っていますね。つまり、それぞれの犬が自分の名前を持っているイメージです。
例えるなら…
クラスを「犬小屋の設計図」、インスタンスを「実際の犬小屋」だとすると、インスタンス変数は「それぞれの犬小屋にある名前プレート」です。
static変数とは?
クラス全体で1つだけの変数
一方、static変数は、そのクラスにたった1つしか存在しません。どのインスタンスからでも共通でアクセスされるんです。
public class Dog {
static int dogCount = 0;
}
このように書いておいて、
Dog.dogCount++; // 犬を増やす
とすれば、どの犬(インスタンス)からでも同じdogCountにアクセスできます。
例えるなら…
static変数は「犬小屋の工場に貼ってあるカウンター」。犬が作られるたびに「あと何匹作ったかな?」というのを記録するのに使うんです。
なぜ区別しないといけないのか?
間違った使い方で起きるトラブル
この2つを区別しないと、以下のような問題が起こります。
1. 意図しない「全体共有」
たとえば、「各ユーザーが自分のスコアを持つゲーム」で、スコアをstatic
にしてしまうと…
public class Player {
static int score;
}
全ユーザーでスコアが共有されてしまう!
Player p1 = new Player();
p1.score = 100;
Player p2 = new Player();
System.out.println(p2.score); // 100になってしまう!
2. メモリの無駄やバグの温床
static
な変数はずっとメモリに残り続けます。必要のないものまでstaticにすると、メモリが無駄になりますし、他のクラスやスレッドから予期せぬ形でアクセスされるリスクも。
まとめ表
種類 | 特徴 | 使いどころ |
---|---|---|
インスタンス変数 | インスタンスごとに個別に持つ | オブジェクトが個別に持つべき情報(名前など) |
static変数 | クラスで1つだけ。全体で共有される | 全体で共通の情報(作られた数、定数など) |
よくある質問(FAQ)
static変数はいつ使うべき?
- オブジェクトの数を数えるとき
- 定数(
final static
)を定義するとき - 全インスタンスで共通の設定を持たせたいとき
など、クラス全体で共有したいデータに使うのが正解です。
次のステップは?
Javaのクラス設計に慣れてきたら、次は次の3つを学んでみましょう!
- staticメソッドとの違い
- finalとの組み合わせ(定数)
- シングルトンパターンにおけるstaticの使い方
これらも「クラス vs インスタンス」の理解がカギになりますよ!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
