第14回 クラスとインスタンス

今まで使ってきた「オブジェクト」について理解を深めます。

目次

お詫び

前回までの記事で、キーボードライブラリとスイッチライブラリを扱ってきました。

キーボードライブラリの場合はKeyboardというオブジェクトを使い、Arduino Microがキーボードとして振る舞う様子を確認しました。また、スイッチライブラリの場合は、自分でスイッチのオブジェクトを作ってスイッチ制御をしました。

ところでこの「オブジェクト」という呼び方は、正確ではないんです。そこで、今回の記事はお詫びから始まります。

正確ではない呼び方をずっと続けてしまい申し訳ございませんでした!

元気に謝罪したところで、なぜ正確ではない呼び方を使っていたか背景を説明します。

今後ご自身で電子工作をして何か作る場合、わからなことが出てくるとまずネットで調べると思います。その時、プログラムの解説で今まで説明してきましたオブジェクトのことを「オブジェクト」と呼んでいるケースもあれば、別の呼び方が使われているケースもあるんです。

余計ややこしくならないことを願いつつ、今まで使ってきた「オブジェクト」が正確ではない、という意味合いを説明します。

唐突ですみませんが、犬にはたくさんの種類がいます。その中に「チワワ」という犬がいますよね。例えば目の前にチワワがいる時、それを指して「犬」と呼んでも間違いではありません。でも、もっと正確な呼び名「チワワ」があります。

今まで使ってきた「オブジェクト」はかなり広い概念の呼び方で、チワワの例の場合は「犬」という呼び方に相当します。確かに「犬」と呼んでも問題はありませんが、「チワワ」と呼んだ方が正確ですよね。今回の記事は「犬」よりもう少し正確な呼び名「チワワ」に相当する名前を習得しよう、という内容です。

キーボードライブラリとスイッチライブラリの違い確認

これから「オブジェクト」の理解を深めていきますが、もう一度キーボードライブラリとスイッチライブラリの違いを確認しておきましょう。

項目 キーボードライブラリ スイッチライブラリ
ヘッダファイル #include <Keyboard.h> #include <avdweb_Switch.h>
オブジェクト作成 不要 必要
Switch hidariSwitch(23);など
メソッド Keyboard.begin();など hidariSwitch.poll();など

この2つのライブラリの大きな違いは、オブジェクトを作る必要があるかどうかです。実は、オブジェクトを作る必要があるライブラリが一般的です。逆にオブジェクトを作る必要がないライブラリはかなり特殊なライブラリです。

そこで、これから一般的なライブラリであるスイッチライブラリについて詳しく説明します。スイッチライブラリの説明が終わった後に、キーボードライブラリがなぜオブジェクトを作る必要がないライブラリないのかについて説明します。

クラスとインスタンス

スイッチライブラリでは自分でオブジェクトを作りました。具体的には以下のようにオブジェクトを作成しましたよね。

Switch hidariSwitch(23);

この文法は以下のような意味合いを持っています。

クラスとインスタンス1

例えば、クッキーを作るときって、クッキーの型を使って、クッキー生地を型抜きしますよね。Switchはクッキー型のようなもので、hidariSwitchは型抜きしたクッキー生地のようなものです。

ところでこの文法ですが、正確には以下のように呼びます。

クラスとインスタンス2

前回までの記事ではhidariSwitchのことを「オブジェクト」と呼んでいましたが、より正確には「インスタンス」と呼んでいます。

また、インスタンスを作るためのクッキー型のようなものは「クラス」と呼んでいます。

通常、クラスからインスタンスを作ることを「クラスからインスタンスを生成する」と言われています。「作る」は普通の言葉ですので、ちょっと専門的に「生成」という言葉を使用しています。

クラスとインスタンス3

再度「オブジェクト」とは?

今まで、インスタンスのことをオブジェクトと呼んできましたが、この「オブジェクト」は広い意味を持つことを説明しました。

それでは、クラスから生成したインスタンス以外に、オブジェクトにはどのようなものがあるのでしょうか。

基礎編パート1で「変数」を扱いましたよね。実はあの「変数」もオブジェクトなんです。また、シリアルモニタのところで文字列を扱いましたが、その文字列もオブジェクトです。

「オブジェクト」は日本語では「もの」という意味でしたよね。変数にしても文字列にしても、概念としてはプログラミングで扱う「もの」なので「オブジェクト」ということになります。

気づくと、何を読まさせているんだろう、という気持ちになってきたのではないかと思います。深く考えていくと、そもそも自分もオブジェクトなのではないか、などの立ち入ってはいけない領域に入ってしまう可能性が出てきます。

スイッチライブラリで扱ったhidariSwitchは広くは「オブジェクト」、正確には「クラスから生成したインスタンス」ということだけ頭に入れておけばOKです。

スイッチライブラリのインスタンス生成

このシリーズではこれからキーボードを製作していくわけですが、当然ながらスイッチは複数個使用します。具体的には、以下の3つのスイッチをキーボードのキーとして使用します。

使用する複数のスイッチ

この3つのスイッチを制御するために、以下のようにそれぞれのスイッチに対して、スイッチクラスからインスタンスを生成してプログラミングします。

スイッチのインスタンス

具体的なプログラムとしては、たとえば以下のようにそれぞそのスイッチに対応するインスタンスを生成します。

Switch hidariSwitch(23);  // 左スイッチのインスタンス
Switch chuoSwitch(22);  // 中央スイッチのインスタンス
Switch migiSwitch(21);  // 右スイッチのインスタンス

このようにSwitchクラスのインスタンスを生成しておけば、例えば中央のスイッチ状態を調査する場合は、chuoSwitch.poll();と書けば調査することができます。

このようにスイッチライブラリを使用する場合、製作するものによってスイッチの個数や接続ピンが異なりますので、インスタンスは自分で生成する必要があります。

キーボードライブラリのインスタンス生成

ところで、キーボードライブラリを使った時を思い出すと、#include<Keyboard.h>でヘッダファイルをインクルードしたあと、すぐにKeyboard.begin();というようにキーボードのインスタンスが使えるようになっていましたよね。

実は、キーボードライブラリでは、ヘッダファイルの中でKeyboardクラスからKeyboardインスタンスを生成しているため、プログラマがスケッチの中でキーボードインスタンスを生成する必要がなかったんです。

では、なぜヘッダファイルでキーボードクラスのインスタンス生成をしてくれているのでしょうか。

先ほどのスイッチライブラリでは、製作するものによってスイッチの個数や接続ピンが異なりますので、あらかじめライブラリ側でインスタンスを生成しておくことはできないですよね。

一方で、キーボードの機能はArduino Microの中に1個しか作ることはできません。

キーボードインスタンス

Arduinoボードでキーボード機能を実現する場合、プログラミングできるキーボードは1個だけです。

あらかじめヘッダファイルで「Keyboard」という名前のインスタンスを生成しておけば、使う人の余計な手間が必要なくなるだろう、というようにライブラリを開発した人は思ったのでしょう。実際にキーボードライブラリのヘッダファイルには、最後にキーボードクラスからKeyboardインスタンスを生成するように書かれています。

今回はオブジェクト、クラス、インスタンスという用語を整理しましたが、ちょっとややこしかったですよね。この後の記事でも出てきますので、多く経験することによって慣れていくようにしてください。

更新履歴

日付 内容
2021.9.23 新規投稿
2022.2.27 導入部分説明補足
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次