ライブラリで使用する「オブジェクト」について理解を深めます。
オブジェクト
前回までの記事で、「キーボードライブラリ」と「スイッチライブラリ」を使ってスケッチを作成してきました。
キーボードライブラリの場合はKeyboardというオブジェクトを使い、Arduino Microがキーボードとして振る舞う様子を確認しました。
また、スイッチライブラリの場合は、自分でスイッチのオブジェクトを作ってスイッチ制御をしました。
ところでこの「オブジェクト」という呼び方は、他の呼び方がされることもあります。
そこで今回は他の呼び方についても確認しておきます。
キーボードライブラリとスイッチライブラリの違い確認
最初に、もう一度キーボードライブラリとスイッチライブラリの違いを確認しておきましょう。
| 項目 | キーボードライブラリ | スイッチライブラリ |
| ヘッダファイル | Keyboard.h | avdweb_Switch.h |
| オブジェクトの作成 | 不要 | 必要Switch hidari(A5);など |
| メソッド | Keyboard.begin();など | hidari.poll();など |
これら2つのライブラリの大きな違いは、自分でオブジェクトを作成する必要があるかどうかです。
このように並べて比較するとどちらも一般的なように感じますが、自分でオブジェクトを作成するライブラリが一般的です。オブジェクトを作る必要がないライブラリはかなり特殊なライブラリです。
そこで、これから一般的なライブラリであるスイッチライブラリを通して新しい用語を理解していきます。
スイッチライブラリの説明が終わった後に、なぜキーボードライブラリはオブジェクトを作る必要がないのかについて説明します。
クラスとインスタンス
スイッチライブラリでは、スケッチで次のように書いて自分でオブジェクトを作成しました。
Switch hidariSwitch(A5); // 左側スイッチのオブジェクトこのスケッチは次のような意味合いを持っています。

このようにして、「A5端子に接続している実際のスイッチ」をスケッチで扱うために、スケッチ上にそれに対応するhidariSwitchという名前の仮想のスイッチ(オブジェクト)を作成します。
例えば、スケッチ上でhidariSwitch.poll();のようにオブジェクトに対して指示(メソッド)書くと、A5端子に接続されたスイッチの状態を調べる、という処理をすることができます。
ところでこのスケッチですが、次のように呼ぶことがあります。

前回までの記事ではKeyboardやhidariSwitchのことを単に「オブジェクト」と呼んでいました。
Arduinoのスケッチを見ていると、上のように「Switch」というオブジェクトの型(種類)を「クラス」、クラスから作成するものを「インスタンス」と呼ぶことがあります。
イメージとしては、「Switch」という部品型の「hidariSwitch」というA5端子に接続された処理を指示できるもの、という感じでしょうかね。(説明がふわふわしてしまい申し訳ございません…!)
この説明では、「部品型」のことを「クラス」、「もの」をを「インスタンス」と呼ぶことになります。
補足すると、前回までの説明では「インスタンス」のことを「オブジェクト」と呼んでいました。(さらにややこしくなってしまいました…!)
実際にネットなどで調べ物をしていると、「インスタンス」より「オブジェクト」と呼ぶケースの方が多いように感じます。ただ、「インスタンス」という呼び方がされることも多いので、どちらの用語にも慣れていただければと思います。
最後に、クラスからインスタンスを作ることを「クラスからインスタンスを生成する」とも言われています。
スイッチライブラリのインスタンス生成
このシリーズではこれからキーボードを製作していくわけですが、当然ながらスイッチは複数個使用します。
具体的には、次のの3つのスイッチをキーボードのキーとして使用します。

この3つのスイッチをスケッチで制御するために、次のようにそれぞれのスイッチに対して、Switchクラスからインスタンスを生成して制御します。

具体的なスケッチとしては、次のようにそれぞそのスイッチに対応するインスタンスを生成します。
Switch hidariSwitch(A5); // 左スイッチのインスタンス
Switch chuoSwitch(A4); // 中央スイッチのインスタンス
Switch migiSwitch(A3); // 右スイッチのインスタンスこのようにSwitchクラスのインスタンスを生成しておけば、例えばchuoSwitch.poll();と書くと、中央のスイッチ状態を調査することができます。
このようにスイッチライブラリを使用する場合、製作するものによってスイッチの個数や接続ピンが異なりますので、インスタンスは自分で生成する必要があります。
キーボードライブラリのインスタンス生成
ところで、キーボードライブラリでは、#include <Keyboard.h>でライブラリのヘッダファイルをインクルードしたあと、すぐにKeyboard.begin();というようにキーボードのインスタンスが使えるようになっていましたよね。
実は、キーボードライブラリでは、ヘッダファイルの中でKeyboardクラスからKeyboardという名前のインスタンスを生成しているんです。
でも、なぜヘッダファイルでキーボードクラスのインスタンス生成をしてくれているのか、ちょっと?ですよね。
先ほどのスイッチライブラリの例では、製作するものによってスイッチの個数や接続ピンが異なりますので、あらかじめライブラリ側でインスタンスを生成しておくことはできないですよね。
一方、キーボードの機能はArduino Microの中に1個しか作ることはできません。(物理的なUSBキーボードをPCに接続すると、複数のキーボードに見える、ということはないですよね)

そこで、あらかじめヘッダファイルでKeyboardという名前のインスタンスを生成しておけば、使う人の余計な手間が必要なくなりますよね。
Keyboardライブラリを開発した人は、このように考えてヘッダファイルの中であらかじめインスタンスを作ってくれているのだと思います。
今回はオブジェクト、クラス、インスタンスという用語を整理しましたが、ちょっとややこしかったですよね。
このあとの記事でも出てきますので、多く目にすることにより慣れていくようにしていただければと思います。
更新履歴
| 日付 | 内容 |
|---|---|
| 2021.9.23 | 新規投稿 |
| 2022.2.27 | 導入部分説明補足 |
| 2025.2.15 | 説明補足 (ただ、相変わらずわかりづらいので見直したほうが良いと考えています。) |
