変数のスコープ


 

スコープ(scope)とは日本語にすると“有効範囲”を表します。つまり、変数のスコープは変数が使える有効範囲のことを指します。

スコープの分類

スコープは、主に以下のように分類することができます。

  • グローバル・スコープ (global scope)
  • ファイル・スコープ (file scope)
  • ローカル・スコープ (local scope)
  • 静的なローカル・スコープ (static local scope)
  • インスタンス・スコープ (instance scope)
  • クラス・スコープ (class scope)
  • クロージャ・スコープ (closurel scope)
  • スレッドローカル・スコープ (threadlocal scope)

グローバル・スコープ

グローバル(global)は、日本語にすると”大域”を表し、グローバル・スコープ(global scope)は、プログラムの「全体」から見えるスコープのことです。このスコープに属する変数はグローバル変数といわれます。BASICのような単純な言語ではグローバル・スコープしか存在しない場合があります。Pythonのようなグローバル変数の書き換えが簡単には行えない言語も存在する。

ファイル・フスコープ

ファイル・フスコープ(file scope)は、グローバル・スコープと似ていますが、プログラムを記述したファイルの内側でのみ参照できるスコープです。プログラムが複数のファイルから構成される場合は他のファイルから参照することはできません。

ローカル・スコープ

ローカル(local)は、日本語にすると”大域”を表し、ローカル・スコープ(local scope)は、ある関数やブロックの範囲内に限定されたスコープのことです。
何を持って範囲を与えるかは言語により様々だが、一般に入れ子のローカル・スコープは外側を参照できるのが普通です。このとき兄弟関係にあるスコープは見えない。変数宣言が必要な言語の場合は宣言文以降にスコープが制限される場合が多い。

  • 関数の先頭で纏めて宣言しなければならない 
    例:Pascal、Delphi
  • 関数のどこでも宣言でき、関数全体で有効 
    例:Javascript
  • 関数のどこでも宣言でき、宣言以降の関数全体で有効  
    例:ABAP
  • 関数のどこでも宣言でき、宣言のブロックの中にのみ有効  
    例:C、C++

インスタンス・スコープ

インスタンス・スコープ (instance scope)は、クラスベースのオブジェクト指向言語で、各インスタンス毎に割り当てられた変数が所属メソッド(メンバ関数)からのみ参照されるスコープのことです。いわゆるカプセル化はこれを指します。。保護されない変数の場合は、クラス定義が見えていてオブジェクトにアクセスできる場合は直接参照できます。C言語の構造体参照なども一種のインスタンススコープです。

クラス・スコープ

クラス・スコープ (class scope)は、 クラスベースのオブジェクトト指向言語で、あるクラスの定義全体から参照できるスコープのことです。インスタンス・スコープと異なり変数が共有されますので、ある種の制限されたグローバル・スコープと考えることができます。クラス・スコープをもたない言語の場合でも、ファイル・スコープを用いることで同様の機構を実現できる場合があります。

クロージャ・スコープ

クロージャ・スコープ (closurel scope)

スレッドローカル・スコープ

スレッドローカル・スコープ(threadlocal scope)は、同じスレッドしか参照できないスコープのことです。マルチスレッド・プログラミングではよく使われます。

各言語の実装

以下の表で各主流言語のスコープ実装状況を示します。

言語 グローバル・スコープ ファイル・スコープローカル・スコープ静的なローカル・スコープインスタンス・スコープクラス・スコープクロージャ・スコープスレッドローカル・スコープ
ABAP××××
Basic×××××××
C×××
Cobal×××××××
C++×
C#××××
Delphi×××
Fortran×××××
Java××××
JavaScript××××××
Pascal×××××
Perl×××
PHP××××
Python××
Ruby××
VB×××××××
VB.net××××××
VC++××××××
VC++.net××××××