【オブジェクト指向の基本】クラス(class)とは ~ ソースコードなしで考え方を解説

2018年11月30日金曜日

プログラミング

クラス皆で勉強

こんにちは、uni-browserの財前です。

このブログは「オブジェクト指向」について、できるだけソースコードを用いることなく、「概念」「考え方」を、丁寧に、初心者の方にも分かりやすく説明することを目的としています。




先日、「【初心者向け】オブジェクト指向とは」という記事の中で、「オブジェクト指向」とは何なのかについてご説明をしました。


「オブジェクト指向」とは一言で言うと、

「実際のモノにたとえて、プログラムの部品を作る考え方」

でしたね。




本日は、その「オブジェクト指向」という考え方を形作る基礎となる、「クラス」というものについて説明をしたいと思います。


少し「オブジェクト指向」のおさらい


部品

オブジェクト指向とは、プログラムの「部品」を作るための考え方でしたね。

同じような機能を持ったプログラムを何度も書くのは効率が悪いため、よく使うプログラムを「部品」として用意しておき、何度も使いまわす、という考え方です。

そしてそのプログラムの「部品」を、「オブジェクト」と呼ぶのでした。

詳細は、こちらの記事をご覧ください。
【初心者向け】オブジェクト指向とは >>



クラス(class)とは


クラスの写真

「オブジェクト指向」における「クラス」とは、オブジェクトの「設計図」のことです。

「その部品はどういう部品なのか」という定義が書かれた設計図を、「クラス」と呼んでいます。


ただ、「クラス」と聞くと、多くの人は、まず別のものを思い浮かべるのではないでしょうか?


たとえば学校において、「学級」「組」という意味を込めて、「クラス」という言葉をよく使いますね。

「クラス(class)」という言葉には本来、「同じ種類のものをまとめた、まとまり」という意味があります。

学校の例で言えば、「3年生」「B組」という風に分類されている、生徒たちの一団のことを、一つの「クラス」と呼びますね。



実は数学の用語でも「クラス」という概念があります。

日本語に直すと「類」と呼ばれるのですが、これも、「共通の性質をもって定義されるものの集まり」という意味です。



オブジェクト指向における「クラス」



プログラミングにおいて「クラス」と言うと、「オブジェクト指向」特有の概念を表します。

ただ、「同じような性質をもっているものの集まり」という、「クラス」という言葉が本来的に持つ意味合いは、「オブジェクト指向」における「クラス」にも通じるものがあります。




「オブジェクト指向」におけるクラスは、一言で言うと、

「オブジェクトの設計図」

です。



この「設計図」という言葉は、このブログの中だけでなく、「クラス」の説明がされるときに一般的によく使われる言い回しです。




どういう事かというと、

「このオブジェクトはどういうものなのか」

ということを、プログラムで書き表したのが、「クラス」というものなのです。




格闘ゲームの例


スマートフォンアプリを連打する男性

先日の「【初心者向け】オブジェクト指向とは」という記事の中で、格闘ゲームのキャラクター作成を例に挙げて、ご説明をしました。


どういう例だったかというと、以下のようにプログラムを書くのはとても面倒くさいので、「他に良い書き方はないかなぁ?」というお話でした。

「Aボタン」を押すと、「キャラクター1」がジャンプ!
「Bボタン」を押すと、「キャラクター1」が攻撃!
「→ボタン」を押すと、「キャラクター1」が右へ移動!
「←ボタン」を押すと、「キャラクター1」が左へ移動!

「Aボタン」を押すと、「キャラクター2」がジャンプ!
「Bボタン」を押すと、「キャラクター2」が攻撃!
「→ボタン」を押すと、「キャラクター2」が右へ移動!
「←ボタン」を押すと、「キャラクター2」が左へ移動!

「Aボタン」を押すと、「キャラクター3」がジャンプ!
「Bボタン」を押すと、「キャラクター3」が攻撃!
「→ボタン」を押すと、「キャラクター3」が右へ移動!
「←ボタン」を押すと、「キャラクター3」が左へ移動!

なんで面倒くさいのかと言えば、「何度も同じようなプログラムを書いているから」ですね。


それを、「オブジェクト指向」を用いれば、以下のように書くことができます。

「キャラクター」とは以下のようなものである。
 ・「Aボタン」を押すと、ジャンプする!
 ・「Bボタン」を押すと、攻撃する!
 ・「→ボタン」を押すと、右へ移動
 ・「←ボタン」を押すと、左へ移動

キャラクター1は、「キャラクター」である。
キャラクター2は、「キャラクター」である。
キャラクター3は、「キャラクター」である。


まず最初に「キャラクター」とはどのようなものなのかを定義して、「キャラクター」というものの一般的な定義を、そこにあらかじめ書いてしまうのでした。

あとは、その「キャラクター」というものの定義を何度も参照して、以降のプログラムを書いていくのでした。



この例で言うと、「クラス」というのは、以下の部分です。

「キャラクター」とは以下のようなものである。
 ・「Aボタン」を押すと、ジャンプする!
 ・「Bボタン」を押すと、攻撃する!
 ・「→ボタン」を押すと、右へ移動
 ・「←ボタン」を押すと、左へ移動


これは、「キャラクターというのはこういう性質を持ったものである」ということを定義した、いわばキャラクターの「設計図」のような部分ですね。


この「設計図」を元にして、以降のプログラムでは、「キャラクター1」「キャラクター2」「キャラクター3」が作成されるのでした。



「キャラクター1」「キャラクター2」「キャラクター3」も、3人とも、全員が「キャラクターである」という点で、同じ性質を持ったものだと言えます。

そういう「同じ性質をもったものの一団」という「クラス(class)」という言葉そのものが本来持っている意味にも矛盾しない形で、この「クラス」という言葉が使われています。



フィールドとメソッド


キャラクターのお面

上記の例から、クラスというものが「オブジェクトの設計図」であることが、分かって頂けたでしょうか。




オブジェクト指向における「クラス」というものを理解する上で、ぜひとも覚えておいて頂きたい言葉が、2つあります。


それは、「フィールド」「メソッド」という言葉です。



「クラスは何によって形作られているのか?」と言えば、それはこの「フィールド」「メソッド」です。



カタカナで書くと分かりにくいのですが、日本語で言うと、

 フィールド =
 メソッド = 動作

だと考えて下さい。


たとえば上記の、格闘ゲームのキャラクターの例。

「キャラクター」というクラスには、以下のような記述がされていました。

 ・「Aボタン」を押すと、ジャンプする!
 ・「Bボタン」を押すと、攻撃する!
 ・「→ボタン」を押すと、右へ移動
 ・「←ボタン」を押すと、左へ移動


これらは全て、「動作」を表したものですね。

ですから、これらは「キャラクター」という「クラス」が持つ、4つの「メソッド」であると考えることができます。

「メソッド」とはそのオブジェクトが行うことができる「動作」のことで、クラスには、「このオブジェクトは、こういう動作ができるんだよー」ということが、設計図として記述されているのです。



ただ、ゲームに出てくるキャラクターが、みんな全く同じだったら、つまらないですね。

ゲームをされない方にはイメージしづらいかもしれませんが、格闘ゲームのキャラクターそれぞれには、個性があるものです。

「こいつは攻撃力が高い」とか
「こいつは動きが速い」とか
「こいつはジャンプ力がある」とか



そういう、キャラクターそれぞれがもっている「値」が、クラスには「フィールド」とう呼び名で定義されています。


上記の「キャラクター」の例を、少し書き換えてみましょう。

「キャラクター」とは以下のようなものである。

値(フィールド)
 ・攻撃力
 ・スピード
 ・ジャンプの高さ

動作(メソッド)
 ・「Aボタン」を押すと、ジャンプする!
 ・「Bボタン」を押すと、攻撃する!
 ・「→ボタン」を押すと、右へ移動
 ・「←ボタン」を押すと、左へ移動


上記では、「攻撃力」「スピード」「ジャンプの高さ」という3つの「フィールド」を用意しています。

「キャラクターというものは、こういう値を持っているんだぜ!」ということが、設計図の中に記載されているんですね。


そしてその「値」は、「キャラクター1」「キャラクター2」「キャラクター3」で、それぞれ別の値を持ちます。

「ジャンプが高いキャラクター」
「攻撃力が弱いけど、スピードが速いキャラクター」
「スピードが遅くてジャンプ力もないけれど、攻撃が強いキャラクター」

なんていう風に、それぞれの能力の「値」「キャラクター」の動きに違いが出てきます。


それが、キャラクターそれぞれの「個性」になって、ゲームで遊ぶ少年たちを楽しませてくれるのですね。



ただ、「クラス」という「設計図」の中には、「このオブジェクトは、こういう値を持てる」ということが記載されているだけです。

どういう事かというと、「設計図」は最初に一回書けば、それを元に色々なキャラクターを作れるので、設計図の時点では必ずしも、「その値は、これぐらい」という具体的なデータは入っていません。

「設計図」の時点でそれを書いてしまったら、個性がなくなってしまいますからね。

そこに具体的な値を入れるのは、個々のキャラクターを作るときであって、設計図自体にはその値は記載されていないことがほとんどです。


「攻撃力という値を持てる」ということだけ書いてあって、「攻撃力が50である」とは書かれていないのですね。



まとめ


海とクラウドと夕日

如何でしたでしょうか。

「オブジェクト指向」における非常に大事な要素である、「クラス」という概念、何となく理解して頂けたでしょうか。


一応まとめておくと、

  • クラスとは、「そのオブジェクトはどういうものなのか」を記述した、「設計図」である

  • クラスは、「フィールド」と「メソッド」を持っている

  • 「フィールド」は、そのオブジェクトが取りうる「動作」を表す

  • 「メソッド」は、そのオブジェクトが持ちうる「値」を表す


次回の記事では、この「クラス」を元にして生成される、「インスタンス」という概念について勉強していきましょう。

この記事が皆様の勉強の助けになれば、幸いです。
本記事を最後まで読んで下さり、ありがとうございました。