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. スコープ」
で、扱おうと思っていることですが、
問題だけ先に出しておきます。
さて、何が、コンソールに、出力/プリント されるでしょうか?