CHAPTER 4 · 14 LESSONS · 182 問
同じ形をまとめて作る(クラス)
設計図を書いて、そこから同じ形のデータを何個でも作る。データと振る舞いをひとつにまとめる考え方。
オブジェクトを使えば、1人ぶんのデータは表せるようになった。では10人ぶんだとどうだろう。{ name: ..., age: ... } を10回書くことになる。項目をひとつ増やしたくなったら、10か所すべてに書き足すことになる。
クラスは、この繰り返しをなくす仕組みだよ。「こういう項目を持つものを作る」という設計図を1回書いておいて、そこから実物を何個でも作る。設計図を直せば、そこから作られるものすべてに反映される。
設計図が クラス、そこから作られた実物が インスタンス と呼ばれる。たい焼きの型と、焼き上がったたい焼きの関係だと思えばいい。型は1つ、たい焼きは何個でも。中身のあんこが違っても、形は同じ。
作るときに中身を決めるのが コンストラクタ。new Person("ゆい", 15) のように書くと、コンストラクタが呼ばれて、渡した値がそのインスタンスに入る。ここで出てくるのが this で、「いま作られようとしている、この実物自身」を指す。this.name = name は「この実物の name という項目に、受け取った値を入れる」という意味だよ。this は最初とっつきにくいけれど、「自分自身」と読みかえれば分かりやすくなる。
次が メソッド。クラスの中に書いた関数で、そのインスタンスのデータを使って何かをする。ここがクラスの本当の価値だ。データと、そのデータを扱う処理が、ひとつの場所にまとまる。人の情報と、人に対してやりたいことが離れて散らばらない。
章の後半は 継承。すでにあるクラスをもとにして、少しだけ違うクラスを作る仕組みだよ。「動物」クラスがあって、そこから「犬」クラスを作る。共通の部分は書き直さず、違うところだけを足す。extends で受けつぎ、super で元のクラスの処理を呼び出す。同じ名前のメソッドを書けば、元の動きを上書きできる。
クラスは、ここまでの章で覚えたものの集大成でもある。変数・関数・オブジェクトが分かっていないと組み立てられないし、逆にそれらが分かっていれば、クラスは「まとめ方のルール」を足しただけのものだと分かる。
継承には使いすぎの落とし穴もある。「AはBの一種だ」と自然に言えるときだけ使うのが安全だよ。「犬は動物の一種だ」は成り立つけれど、「たまたま似た処理があるから継承しておこう」でつなぐと、片方を直したときにもう片方が壊れるようになる。継承は共通化の道具ではなく、関係を表す道具だと考えておこう。
この章でつまずきやすいのは、やはり this だよ。同じ this でも、どこに書いたかで指すものが変わる。コンストラクタの中では「いま作られている実物」、メソッドの中では「そのメソッドを呼び出した実物」を指す。混乱したら「誰の話をしているのか」を声に出して確かめるといい。
もうひとつ、クラスとインスタンスを混同しないことも大事だよ。クラスは型であって、そこには具体的な値は入っていない。値が入るのは、new で作った実物のほうだ。この2つを取りちがえると、「なぜ値が取れないのか」で長く悩むことになる。
この章を進めるときは、まず紙かメモに設計図を書いてみるといい。「このクラスはどんな項目を持つか」「どんなことができるか」を先に言葉にしてから、コードに落とす。いきなり書きはじめると、途中で項目が足りないことに気づいて何度も書き直すことになるよ。
なお、実際の開発ではクラスを使わない書き方も多い。それでも他人のコードには必ず出てくるし、データと処理をひとまとめにするという発想自体は、クラスを使わない設計でも生きてくる。読めるようにしておくことには十分意味があるよ。
この章のレッスン
設計図と実物
作るときの初期化
振る舞いを持たせる
受けついで作りかえる