インスタンス変数とは、
オブジェクト指向プログラミングにおける重要な概念の一つで、オブジェクトの
インスタンスごとに割り当てられる変数のことを指します。これは、各オブジェクトが持つ固有のデータや状態を表すために使用されます。別名として、
フィールド、
データメンバ、
メンバ変数とも呼ばれます。
クラス変数との違い
インスタンス変数と対比される概念として、
クラス変数があります。クラス変数は、そのクラスのすべての
インスタンスで共有される変数であり、一つの値が全ての
インスタンスに影響を与えます。一方、
インスタンス変数は、各
インスタンスがそれぞれ異なる値を保持できます。
呼び方の違い
インスタンス変数は、
インスタンスフィールド、または略して
フィールドと呼ばれることもあります。本来、フィールドという言葉はクラス変数も含む広い意味を持ちますが、
プログラミング言語によっては、
インスタンス変数を特にフィールドと呼び、クラス変数と区別する場合もあります。
また、UML(Unified Modeling Language)では、
インスタンス変数を
属性 (attribute) と呼ぶこともあります。
Javaのクラスを用いて、
インスタンス変数とクラス変数の違いを具体的に見てみましょう。
java
class Foo {
String bar; //
インスタンス変数
static String baz = "baz"; // クラス変数
}
public class Main {
public static void main(String[] args) {
Foo foo1 = new Foo();
Foo foo2 = new Foo();
foo1.bar = "foo1.bar";
foo2.bar = "foo2.bar";
System.out.println("foo1.bar=" + foo1.bar + " foo1.baz=" + foo1.baz);
System.out.println("foo2.bar=" + foo2.bar + " foo2.baz=" + foo2.baz);
}
}
上記の例では、`bar`が`Foo`クラスの
インスタンス変数であり、各`Foo`オブジェクト(`foo1`と`foo2`)が独立した`bar`の値を持ちます。一方、`baz`はクラス変数であり、`Foo`クラスのすべての
インスタンスで共有されます。
プログラム実行結果と詳細解説
上記の
Javaプログラムを実行すると、以下の結果が得られます。
foo1.bar=foo1.bar foo1.baz=baz
foo2.bar=foo2.bar foo2.baz=baz
実行結果から分かるように、`foo1.baz`と`foo2.baz`は、クラス変数`baz`を参照しているため、同じ値("baz")になります。これは、クラス変数がクラスのすべての
インスタンス間で共有されるためです。
一方、`foo1.bar`と`foo2.bar`は、
インスタンス変数`bar`を参照しているため、それぞれ異なる値("foo1.bar"と"foo2.bar")になります。これは、
インスタンス変数が
インスタンスごとに独立して存在するためです。
まとめ
インスタンス変数は、
オブジェクト指向プログラミングにおいて、オブジェクトの固有の状態を保持するための基本的な要素です。クラス変数との違いを理解することで、より効率的で柔軟なプログラムを設計することができます。
インスタンス変数を適切に活用することで、各オブジェクトが独立した振る舞いを持ち、複雑なシステムを構築するための基盤となります。
関連用語
クラス (コンピュータ): オブジェクトの設計図となるもの。
メソッド (計算機科学): オブジェクトの振る舞いを定義するもの。
フィールド (計算機科学): インスタンス変数やクラス変数の総称。
クラス変数: クラスのすべての
インスタンスで共有される変数。
オブジェクト指向プログラミング: オブジェクトを基本単位とするプログラミングパラダイム。
プロパティ: オブジェクトの特性を表す用語。
インスタンス変数と関連する。
*
属性: オブジェクトの特性を表す用語。UMLにおいて
インスタンス変数を指す。