19.0504

スコープ(scope)

スコープ とは、
  プログラムの中で使う 変数 使える範囲 のこと
です。
ここで、
  使える範囲
という言い方をしましたが、
  アクセスできるかどうか
という意味です。
スコープ の話題は、単に、ブロックスコープ/{ } だけではなく、
  アクセス修飾子 など(まだ学習中なので、うまく書けません)
いろいろな、側面から見る必要があります。
たとえば、IntelliJ では、同じプロジェクトであれば、ファイルが違っていても、見えるようです。

ここでは、
  超基本の
    1. { } による、アクセス制限
    2. 関数/メソッド の引数 の、アクセスできる範囲(シャドーイング に注意)
について、見ていきます。


1. 基本ルールをマスター
これに関しては、超簡単だと思います。
例えば、
  class X constructor() {  プロパティ;  fun y(引数) {  {  {  }  }  }  }
こんな、class X が、あるとします(あくまで、イメージ図ですので)。
この時、
  1. 同じ色 の { } の中にある 変数 に関して、それより内側から は、アクセスできる
     /(逆に、外側からは、アクセス出来ない/使えない)
     / { } の範囲を、ブロック と言います。
     / そしてこれで、スコープが決められている場合、ブロックスコープ と言います。
  2. メソッド y の引数 の範囲は、!ここ! です(ここは、ブロックの外だが、間違えないように)。


2. 基本を踏まえて、実際のコードで確認します
何が コンソール に 出力 されますか?
例題1:
まずは、このコードでは、何が、コンソール に、出力されるでしょうか
この問題では、基本の、ブロックスコープ の、考えで、OKです。
答えは、こうなります

例題2:
この問題でも、「シャドーイング」 が、出てきます
シャドーイングとは、以前使った変数 と、名前 が、同じであることです。
これにより、うっかり、値を、取り違えることがあります。
Kotlin では、同じブロック内での、シャドーイング は、出来ません。
答は、こうなります

ここから、色分け が、ありません、、自信があれば、そのまま考えて、なければ、
KotlinPlaygroundなどに、貼り付けて考えてください。

例題3:
この問題は、「引数が、シャドー(影)になる] パターンです。
このパターンが一番間違えやすいかもしれません。
答は、こうなります
先に述べた、「メソッドの引数 の スコープ」 に、注意してください。

例題4:
これは、thisキーワード を、理解していれば、簡単です。
答は、こうなります

例題5:
これも、thisキーワード を使っています
答は、こうなります

例題6:
これは、だまされないでください
答は、こうなります



まとめ
スコープ とは、プログラムの中で使う 変数 使える範囲 のことです。
・ class X constructor() {  プロパティ;  fun y(引数) {  {  {  }  }  }  }
 こんな、class X が、あるとします(あくまで、イメージ図ですので)。
 この時、
   1. 同じ色 の { } の中にある 変数 に関して、それより内側から は、アクセスできる
      /(逆に、外側からは、アクセス出来ない/使えない)
      / { } の範囲を、ブロック と言います。
      / そしてこれで、スコープが決められている場合、ブロックスコープ と言います。
   2. メソッド y の引数 の範囲は、!ここ! です(ここは、ブロックの外だが、間違えないように)。