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.namedog2.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つを学んでみましょう!

  1. staticメソッドとの違い
  2. finalとの組み合わせ(定数)
  3. シングルトンパターンにおけるstaticの使い方

これらも「クラス vs インスタンス」の理解がカギになりますよ!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。