19.0415

class ⇒ instance(クラス と インスタンス)

classとは、
  変数関数 を、まとめたもの
と、言えます。

そうすることによって、
  人、乗り物、動物
あるいは、
  入力、出力 などの、抽象的な概念
までを、
  バーチャルな オブジェクト/インスタンス
として、扱い、
  あたかも、例えば、飛行機や車 を、扱っているかのように、
  プログラミングが出来る
ようになるのです。

実際の、コンピュータが、行っていることと、
実際のアプリの動作 は、
私たちには、関連付けるのは、難しいと思われます。

それを、工夫して、バーチャルに、プログラミング 出来るようにしたのが、
(C言語のように、コンピュータに、密接していないという意味で)
(また、密接して、プログラミング するニーズも、もちろんあります)
オブジェクト指向プログラミング と、言えるでしょう。

その具体的な方法が、
  class
と、言えます。

今、こんな Catクラスを、作って見ました。
これを、見ながら、class について、考えてみましょう。

繰り返しますが、
  class とは、変数関数 を、まとめたもの
です。
具体的には、例えば、今表示している、Catクラス が、そうです。


1. クラス/class から、インスタンス/instance を、組み立てる、コンストラクタ
コンストラクタ とは、特別な、関数です。
右のコードでは、
  Cat()
が、そうです。
これは、引数 が、ないコンストラクタです。
コンストラクタは、
  class の、インスタンス/実例 を、return
します。
(ちなみに、コンストラクタ / constructor とは、建設者、大工さん(carpenter) みたいなものです)
という事は、class の、インスタンスを、作るには、
  val(変数ですよ) mike(変数) = Cat()
    / val mike = Cat()
こう書けば、
  mike(三毛)という、一匹の猫が、誕生します。(バーチャルですが)
ここで、気を付けなければいけないのは、
  mike という、変数は、特別な変数で、
  インスタンス変数
という、class の、コンストラクタ から、作られる、特別な変数です。
一般には、オブジェクト とも言いますが、
Kotlin の、オブジェクトには、2通りあるので、あえて、「インスタンス / インスタンス変数」 と、言っています。
2通りあるといったのは、前にも、触れましたが、
  value-type / 値型
のことです。
あまり、Java の話はしないようにとは、思っていますが、
あえて、言わさせていただきますと、
  primitive/プリミティブ 型
が、まさに、value-type で、
  int ⇒ Int
  double ⇒ Double
のように、頭の小文字を、大文字に代えたのが、
まさに、Kotlin の、value-type なのです。

一般的には、インスタンス よりも、オブジェクト と言う方が、多いかもしれませんが、
私は、
  インスタンス と、言って、はっきり、設計図class の、実例の変数
と、自覚するようにした方が、いいと思っています。


2. プロパティ と メソッド(property/field、method)
いま、ここで、クラスの構成を、
  変数
  関数
と、言いましたが、
class の、場合、特別な、名前があります。
  class自身が、持つ、変数
    / class の 関数の内部にあるような 変数 ではないという意味
のことを、
  フィールド / プロパティ
  フィールド変数 / プロパティ変数
と、言います。
そして、普通は、
  class の、フィールド
  class の、プロパティ
という方が、多いでしょう。
先に、「変数 と 関数」 だと言ったのは、
理屈は、そうだからです。

また、クラスが持つ関数 に、関しても、
  その場合の呼び方
が、あります。
それは、
  メソッド
と言いますが、
Kotlin の世界では、関数、メソッド では、どちらの言い方が多いかは分かりません。
でも、メソッド という言葉には、特別な意味があるので、
私は、
  メソッド と呼んだ方が、好ましい
とは、思っていますが、これも、文脈 で、どちらにも使われるでしょう。

どこが、普通の 関数 と、違うのかと言うと、
  メソッド/method を、呼ぶことが出来るは、
  そのメソッドがあるclass の、インスタンス のみ

である、という事です。

これは、複雑な話ではなくて、その方が、メソッドの働きを連想しやすく、
覚えやすくなるでしょう。


3. クラスの、プロパティ と メソッド に、アクセスする
では、また、Catクラス を、見てみます
そのコードの、
    mike.name = "玉"
    mike.age = 5
    mike.color = "三毛猫"
    mike.introduceMyself()
    mike.meow(3)
の部分が、アクセスしているコードです。

それぞれの対応は、①~⑤の番号に、対応しています

要は、
  .
を、使って、
  プロパティ
  メソッド
に、アクセスできるわけです。

①~③ の場合は、
  プロパティ の、値を(デフォルト値を書き換えて)設定
しています。

また、④、⑤ の場合は、
  メソッド を、呼んでいる
ことになります。

それぞれ、
  Catクラスインスタンス/mike
  を、使って、プロパティ を、設定したり、メソッド を、呼び出して
います。

こんな風にして、プログラミングすることが、
オブジェクトプログラミングだと、言えるでしょう。
この場合でしたら、
  ねこの、三毛ちゃん の、
  名前や、毛の色 を、設定したり、
  回数を決めて、みゃ~お と、鳴くような、
  プログラミング を、している
と言えますね。

次回は、プロパティ への アクセス に、ついて、
もう少し、深く踏み込んでみます。
今回は、
  プロパティ の、設定
を、やりましたが、
今度は、
  プロパティ の、取得/ゲットすること
についても、見てみます。

コードとしては、今日やった通りの、考えで、OKです。
ただ、省略しない場合のコード について、
少しだけ考えてみます。
実は、私もよくは分からないのですが、
レベルが高くなった時、知っておいた方がいいと思われますので
ちらっと見ておきましょう。
1回見ておくと、2回目が、覚えやすいですから。



●まとめ
・class とは、変数 と 関数 を、まとめたもの で、ある。
・class の、変数 と 関数 には、特別な呼び方がある。
  変数:プロパティフィールド
  関数:メソッド
・設計図class から、実物インスタンス を、作成するには、コンストラクタ を、使う。
・コンストラクタ の形式は、クラス名() である。
  例:Car()、Person()、Cat()
・class の、実体/実物/インスタンス を、代入した、変数を、インスタンス変数と言う。
  ただし、オブジェクト と、言っている時もあります。
  その時は、class の、インスタンス のことなのかどうかは、文脈から、考えてください。
・class の、インスタンス(オブジェクト) を、インスタンス変数 に、代入する式は、
  val 変数名 = クラス名()
    例えば、 val tama = Cat() の、ように書きます。
・class の、プロパティ・メソッド に、アクセスするには、
  インスタンス変数.プロパティ/メソッド
 のように、アクセスします。



予習になりますが、
  ・ 間違えやすい、変数のスコープ/変数が及ぶ範囲
  ・ this という単語は、誰でも知っていますが、thisキーワード は、少しだけ難しいです.
これらのことで、問題を作りました。
これは、「31. スコープ
で、扱おうと思っていることですが、
問題だけ先に出しておきます。
さて、何が、コンソールに、出力/プリント されるでしょうか?