インスタンス変数

インスタンス変数とは



インスタンス変数とは、オブジェクト指向プログラミングにおける重要な概念の一つで、オブジェクトのインスタンスごとに割り当てられる変数のことを指します。これは、各オブジェクトが持つ固有のデータや状態を表すために使用されます。別名として、フィールドデータメンバメンバ変数とも呼ばれます。

クラス変数との違い



インスタンス変数と対比される概念として、クラス変数があります。クラス変数は、そのクラスのすべてのインスタンスで共有される変数であり、一つの値が全てのインスタンスに影響を与えます。一方、インスタンス変数は、各インスタンスがそれぞれ異なる値を保持できます。

呼び方の違い



インスタンス変数は、インスタンスフィールド、または略してフィールドと呼ばれることもあります。本来、フィールドという言葉はクラス変数も含む広い意味を持ちますが、プログラミング言語によっては、インスタンス変数を特にフィールドと呼び、クラス変数と区別する場合もあります。

また、UML(Unified Modeling Language)では、インスタンス変数を属性 (attribute) と呼ぶこともあります。

Javaでの例



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においてインスタンス変数を指す。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。