1. はじめに:Java変数スコープの基本
Javaの変数スコープとは、変数がアクセス可能なコードの範囲、またはその変数が「生きている」範囲のことを指します。
変数のスコープは、変数が定義された場所によって決まります。そして、このスコープの理解はプログラムの動きを正確に把握するために極めて重要となります。
変数とは?
まずは基本から!変数とは、データを一時的に格納するための「箱」のようなものです。
Javaにおいて、変数はデータ型と名前(識別子)を持ちます。データ型は、変数がどのような種類のデータを格納できるかを示し、名前はその変数を指定するために使用されます。
KindleUnlimited会員であれば、全ての本をご覧頂けます。 StreamAPIを理解すれば、Javaの世界が変わる 第1版
Javaの変数スコープの種類
Javaには大きく分けて、ローカル変数、インスタンス変数、クラス変数という、3つの主要な変数スコープが存在します。
それぞれの変数がどのように使われ、どの範囲で有効なのか、詳しく見ていきましょう。
2. ローカル変数について深掘り
ローカル変数は、メソッド内で定義され、そのメソッド内だけでアクセス可能な変数です。
ローカル変数は、メソッドが呼び出されるたびに作成され、メソッドが終了すると同時にスコープを抜け、その変数はメモリから解放されます。
ローカル変数の特徴
- メソッド内でのみアクセス可能
- メソッドが呼び出されると作成され、メソッドの終了と共に解放される
ソースコード例
1 2 3 4 5 6 7 8 9 10 |
public class Program { public static void main(String[] args) { showLocalVariable(); } public static void showLocalVariable() { int localVariable = 100; // This is a local variable System.out.println(localVariable); } } |
出力結果 100
このように、ローカル変数localVariableはshowLocalVariableメソッド内でのみアクセス可能で、このメソッドが終了すると解放されます。
3. インスタンス変数の探求
次に見るのは、インスタンス変数です。インスタンス変数は、クラスのインスタンスごとに一意であり、オブジェクトが生成される度に新しいコピーが作成されます。
Javaでは、クラスからオブジェクトを生成します。オブジェクトは、クラスの「実例」または「インスタンス」とも言われ、クラス内で定義されているフィールド(変数)やメソッド(関数)を持ちます。
インスタンス変数の特徴
- クラスレベルで定義され、クラスのインスタンス(オブジェクト)ごとに一意
- オブジェクトのステート(状態)を保持
- オブジェクトがガベージコレクトされるまで生存
ソースコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class Dog { // Instance variable String name; // Constructor Dog(String name) { this.name = name; } void bark() { System.out.println(name + " says: Woof!"); } } public class TestDog { public static void main(String[] args) { // Creating instances Dog myDog = new Dog("Buddy"); Dog yourDog = new Dog("Max"); // Accessing instance variable through objects myDog.bark(); // Buddy says: Woof! yourDog.bark(); // Max says: Woof! } } |
出力結果 Buddy says: Woof! Max says: Woof!
このコード例では、Dog
クラスにインスタンス変数name
があります。そして、myDog
とyourDog
という2つの異なるオブジェクト(インスタンス)を作成しました。各オブジェクトは自分自身のname
変数を持っており、異なるメモリアドレスに格納されます。このように、インスタンス変数は、各オブジェクトごとに一意です。
4. クラス変数とは
最後に、クラス変数を見ていきましょう。クラス変数もクラスレベルで定義されますが、static
キーワードを使って定義され、クラスのすべてのインスタンスで共有されます。
クラス変数の特徴
static
キーワードを用いて定義される- クラスのすべてのインスタンスで共有される
- オブジェクトを生成しなくてもアクセス可能
ソースコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class Cat { // Class variable static int catCount = 0; // Constructor Cat() { catCount++; } static void showCatCount() { System.out.println("Number of cats: " + catCount); } } public class TestCat { public static void main(String[] args) { // Creating instances new Cat(); new Cat(); new Cat(); // Accessing class variable without object Cat.showCatCount(); // Number of cats: 3 } } |
出力結果 Number of cats: 3
クラス変数catCount
は、Cat
クラスのすべてのインスタンスで共有されます。そのため、オブジェクトを生成するたびに増加し、showCatCount()
メソッドを通じて現在の総数を表示します。
5. まとめ
Javaにおける変数のスコープとは、その変数がアクセス可能な範囲を意味します。正しいスコープと生存期間を理解し、適切な変数タイプを選択することで、メモリの無駄遣いを防ぎ、プログラムの効率を向上させることができます。
以上で、Javaにおける変数のスコープに関する説明を終わります。サルモリさん、質問はありますか?