プログラミングやRPAで変数を作るときに、言語や製品によっては「型」を意識しなければならない場合があります。
この「型」に関する考え方でつまづく初学者の方はかなり多いようです。
そんなわけで、この記事では「型ってそもそも何なの?」という部分を説明していきます。
この記事は主にRPA開発の初心者向けに書いているので、「Bot」という言葉が出てきます。
プログラミングの学習者の方は、「Bot」の部分を「プログラミング言語」に置き換えて読んでください。
変数 = データの入れもの
型に入る前に、そもそも変数って何? という方は、こちらのツイートをご覧ください。
(ブログにリンクが飛んでいますが、ツイートの中の画像を見ればポイントはわかると思います)
RPA作ってる人は、必ず「変数」を使っていると思いますが
— IQぼっち🍊5/21は🔰基本&実務で使える🔰RPA勉強会! (@IQ_Bocchi) May 10, 2021
「変数ってそもそも何ですか?」という超基本の説明を、5分で読めるブログにしました。#AutomationAnywhere 本家のコミュニティサイト #Apeople への掲載ですが、説明の内容はツール関係なしの知識です。https://t.co/Kql9rfjcpn pic.twitter.com/SanDylOwed
型 = 入れものの形
上記のツイートの図では、「品名」も「単価」もいずれも四角い箱に入っていますが、実際には、この入れものには様々な形があります。
入れものの形は、そこにどんな中身が入るかによって変わります。
その「形」こそが、変数の「型」なのです。
どうして形を変える(=型を分ける)必要があるの?
ここで当然、こんな疑問が湧くでしょう。
「どうして入れものの形(=変数の型)をあれこれ分ける必要があるのか?」と。
答えは大きく分けて2つあります。
- 変数に型が必要な理由1:入れ物を見ただけで(中身を開けなくても)どう扱えばいいのかがわかるから
- 変数に型が必要な理由2:たくさんの品物(=データ)をまとめてしまっておきたいときに便利だから
です!
では、ひとつずつ詳しく見ていきましょう。
変数に型が必要な理由1:入れ物を見ただけで(中身を開けなくても)どう扱えばいいのかがわかるから
ちょっと、たとえ話で説明してみます。
あなたは以下のようなコーヒー屋の店員さんです。
お店では、袋に入ったコーヒー豆と、テイクアウト用のコーヒーを売っています。
あなたが店番をしているときに、お客さんがやってきて**「コーヒーください」**って言われたらどう思いますか?
・・・ぽかーん(・_・;) ってなるか、 どっちやねーん( `ー´)ノ と突っ込むかは性格によると思いますが、いずれにしても、豆と飲む方とどっちのコーヒーがほしいのかを確認しなければならなりませんよね。
これがまさに、型を指定されなかったときのBotの気持ちです。
もちろん、店員さんとしては「豆ですか? 飲む方ですか?」などと聞けばいいだけの話です。
プログラミング言語の中には、実際にそんなふうに気を効かせてくれるタイプの言語もあります(動的型付け言語といいます)。
ですが、会話が一往復増えるので、そのぶん一人のお客さんに対応する時間が長くかかります。
そこで、お客さんが注文をするときに、一工夫加えてもらいます。
もちろん、「飲む方のコーヒーをください」と言葉で伝えてもいいわけですが、こんなやり方もできます。
それは、コーヒーをどんな入れもの(=変数)に入れてほしいかを見せながら注文するというやりかたです。
こうすれば、**入れものの形(=型!)**を見ただけで、店員さんは何を出せばいいのかすぐわかりますよね。
※ コーヒーをヤカンで入れるのかというつっこみはなしでお願いします(画像の素材が見つからなかっただけです。。。)
これが、型のひとつの役割です。
上記の例でわかりにくければ、運送用の荷物の段ボールに貼ってある「ワレモノ」とか「冷蔵」などのシールをイメージしてもらってもいいです(シールが「型」)。
あのシールがあることで、運送屋さんは段ボールをいちいち開けなくても、「これはワレモノだから落とさないように気をつけよう」とか、「冷蔵だから早く運ばなくちゃ」などと気をつけることができます。
このように、Botは型によって、データをどう扱えばいいのかを判断しているのです。
具体的な型の例:数字、文字列、日付
上記のように、入れものの形(=型)を見ただけで扱い方がわかる! というメリットを活かした型に、例えば以下のようなものがあります。
型の種類 | 何が入る? | どう扱う? |
---|---|---|
数字 | 1や2などの数字 | 数を数えたり、計算するときに使います。 |
文字列 | 「みかん」「りんご」などの文字 (数字が入る場合もある) |
データを単純に文字として扱いたい場合に使います。 もっとも使い道の広い型ですが、例えば以下のような使い道があります。 - ファイルやフォルダに名前をつける - Excelの番地(「A1」など)を指定する - メッセージを表示する 上記のように、「何かの名前をつける」「メッセージを表示する」的なことをしたい場合は、必ず文字列型にしておく必要があります。 また、文字列同士をくっつけたり、文字列の一部を取り出したりすることもできます。 |
日時 | 日付や時刻の情報 | 日付同士の計算をしたいとき。たとえばこんなときに使います。 - 2021年5月18日の180日前の日付を求める - 2021年5月18日と1982年1月1日が何日離れているかを求める |
↑の表を完璧に覚える必要はなく、さらっとイメージだけでOKです。
数字の型に入っていれば、Botは「ボクはこれを使って計算をすればいいんだな」とわかりますし、文字の型に入っていれば「これをファイルに書いたり、メッセージに表示したりするんだな」とわかります。
ちなみに表に書いた種類は一般的な整理で、プログラミング言語によっては「小数と整数は別の型」とか「桁が大きい数字と小さい数字は別の型」みたいになっている場合もあります。
(チロルチョコと板チョコでは、適した包み紙の大きさが違うようなイメージですね)
以下、この**「型によって扱いが決まる」**という性質と、それに伴い初心者さんがつまづくであろうポイントを、少し掘り下げて説明していきます。
Botが変数をどう扱うかは、中身ではなく型によって決まる
先ほど、型は入れものの形であるとともに、運送屋が段ボールに貼ってあるシールのような役割を果たしていると言いました。
例えば運送屋がワレモノシールのついた箱(=入れもの=変数)を運んでいるときに、「これ本当にワレモノかな?」などと箱を開けて中身を確かめたりはしませんよね。
箱にワレモノシールが貼ってある以上、中身が何であれ、慎重に運ばないといけませんし、投げたり落としたりしてはいけません。
同様に、箱に冷蔵シールが貼ってあれば、中身が何であれ、冷蔵車で運ばないといけません。
このように、運送屋が荷物の入った箱をどう扱うかは、箱の中身ではなく、箱にどんなシールが貼ってあるかで決まります。
同様に、Botが変数(=データの入った入れもの)をどう扱うかも、変数の中身ではなく、型で決まります。
箱(=変数)の中身が変な扱いをされないように、箱(変数)に入れる前にチェックする
以上のように、ひとたび箱に入ってしまった中身を、運送屋が開けて見ることはありません。
なので荷物を送る人は、箱詰めをする段階で、適切な箱に適切な中身を入れるように気をつけておく必要があります。
変数の場合も同じで、データの中身を変数に入れようとした時点で、違反をチェックしてブロックします。
数字型の変数の中には、「123」といった数字や、「4+5」のような数字同士の計算結果は入れられますが、「みかん」のような文字を入れることはできません。
(ちょっとマニアックな話:プログラミング言語の中でも動的型付けの言語(PythonやRuby,PHPなど)は、この挙動が起こりません。Pythonの場合、「みかん」を入れようとした時点で箱の形が文字列型に変わります(型推論)。でも型推論をしてくれる言語だからといって、型に関するエラーが起きないわけではありません。型に合わない値を入れようとした段階でエラーが起きるか、型に合わない扱い方をしようとした時点でエラーが起きるかが違うだけです。)
「みかん」を数字型の変数に入れることはできないが、「123」や「4+5」を文字列型の変数に入れることはできる
さて、このあたりからが、初心者の方がつまづきやすいポイントになってきます。
先ほどの図では、数字型の箱に「みかん」という文字を入れようとして怒られているところを説明しました。
数字型は、数字以外の文字を入れることを許さない、ちょっと厳しめの型です。
ですが、文字列型はそうではありません。
「みかん」は数字ではありませんが、「123」のような数字や、「4+5」のような計算式も文字の一種なので、文字列型に入れることができてしまいます。
「できてしまいます」って書くといけないことみたいですが、文字列型の変数に数字や日付を入れるのは、全然よくある話です。
数字型に入れた「4+5」と文字列型に入れた「4+5」の違い
「123」のような数字や、「4+5」のような計算式は、数字型にも入れられるし、文字列型にも入れられることがわかりました。
ところで、これらを数字型に入れたときと、文字列型に入れたときでは、どんな違いがあるのでしょうか?
わかりやすい例で、「4+5」を数字型・文字列型にそれぞれ入れた場合を考えてみましょう。
ちょっと予測してみてください。
ヒントとして、「数字型にデータを入れる」ということは、Botは「ここに入ってくるデータを、ボクは計算するんだな」というつもりで待ち構えています。
一方、「文字列型にデータを入れる」ということは、Botは「ここに入ってくるデータを、ボクは文字として扱うんだな」というつもりで待ち構えています。
予測できましたか?
答えは……
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
こうなります!
数字型の場合は、Botは計算するつもりで構えているので「4+5」を計算式として扱い、計算した結果の「9」が返ってきます。
一方、文字列型の場合は、Botは入ってくるデータを単純に文字として扱うので、「4+5」がそのまま文字として返ってきます。
いかがでしょうか。
Botは変数の型によってデータの扱い方を変えるということを、少しは具体的にイメージできたでしょうか。
どの型を使うべきかは、入る中身で決まるんじゃない! 扱い方で決まるんだ!
これまでの説明を踏まえて、今一度、どうやって型を使い分けるべきかを考えてみましょう。
たまに「数字は数字型に入れるんだよ」みたいな雑な説明をしている人がいますが、これこそ初心者の混乱の元凶になっていると思います。
ここまで読んで来たみなさんはもうわかりますよね。
数字型に入れるか、文字列型に入れるかは、中身が数字かどうかでは決まりません。
そのデータをどう扱いたいかで決まるのです。
計算したい場合は数字型。では、文字列型に入れるのはどんなとき?
数の計算ができるのは数字型だけなので、「計算したい場合は数字型に入れる」というのはわかると思います。
では逆に、文字列型に入れなければならないのはどんなときでしょうか?
ここで今一度、先述の表をおさらいしてみましょう。
(わかりやすいように、数字型と文字列型だけを切り出しています)
型の種類 | 何が入る? | どう扱う? |
---|---|---|
数字 | 1や2などの数字 | 数を数えたり、計算するときに使います。 |
文字列 | 「みかん」「りんご」などの文字 (数字が入る場合もある) |
データを単純に文字として扱いたい場合に使います。 もっとも使い道の広い型ですが、例えば以下のような使い道があります。 - ファイルやフォルダに名前をつける - Excelの番地(「A1」など)を指定する - メッセージを表示する 上記のように、「何かの名前をつける」「メッセージを表示する」的なことをしたい場合は、必ず文字列型にしておく必要があります。 また、文字列同士をくっつけたり、文字列の一部を取り出したりすることもできます。 |
文字列型には、以下の例がありますね。
- ファイルやフォルダに名前をつける
- Excelの番地(「A1」など)を指定する
- メッセージを表示する
これらの操作をするときは、たとえ中身が数字や日付であっても、型は文字列型にしておく必要があります。
このあたりも、初心者のつまづきポイントのひとつだと思いますが、具体例で見てみましょう。
「中身が数字でも文字列型」の例:社員番号でフォルダを作る場合
例えば以下のように、社員全員分のフォルダを作るためのBotを考えてみます。
フォルダ名には、社員番号をつけます。
具体的にどう作るかは製品によりますが、構造はどのRPAでも同じで、ざっとこんな感じでしょう。
(以下の図はAutomation Anywhereの場合)
上記①の「Excelの全行を回すループ」の中で、Excelの中から今処理している行の社員番号を変数に入れます。
②の「社員番号でフォルダを作成」の操作をする際、その変数から社員番号を取り出してフォルダ名にします。
具体的にイメージしてもらうために、フォルダを作るアクションの詳細を載せてみます。
アクションの詳細を確認すると、作成するフォルダのパスを指定する欄があります。
(パスって何? という人は、こちら(https://www.wordvbalab.com/pc/3943/ )を参照)
フォルダパスの部分をさらに詳しく見てみましょう。
① フォルダを作る場所(親フォルダ)のパス を指定している部分と、
② 実際に作るフォルダの名前 を指定している部分があって、
②の部分が変数になっています。
$社員番号$
という、$
マークにはさまれた部分が変数です。
ここでいよいよ本題ですが、この変数の型はどうするべきでしょうか?
社員番号は「1001」「2002」「3003」と、数字しか入らないので数字型かな?
と、思った人は、もう一度思い出してください。
数字型に入れるか、文字列型に入れるかは、中身が数字かどうかでは決まりません。
そのデータをどう扱いたいかで決まるのです。
今回は、このデータをどう扱いたいか? そう、「フォルダ名に名前をつけるために使いたい」んですよね。
それを踏まえて今一度、型の種類の一覧表を見てみましょう。
太字の部分にご注目。
型の種類 | 何が入る? | どう扱う? |
---|---|---|
数字 | 1や2などの数字 | 数を数えたり、計算するときに使います。 |
文字列 | 「みかん」「りんご」などの文字 (数字が入る場合もある) |
データを単純に文字として扱いたい場合に使います。 もっとも使い道の広い型ですが、例えば以下のような使い道があります。 - ファイルやフォルダに名前をつける - Excelの番地(「A1」など)を指定する - メッセージを表示する 上記のように、「何かの名前をつける」「メッセージを表示する」的なことをしたい場合は、必ず文字列型にしておく必要があります。 また、文字列同士をくっつけたり、文字列の一部を取り出したりすることもできます。 |
「ファイルやフォルダに名前をつける」という扱い方をしたい場合、その扱い方に対応しているのは文字列型です。
したがってこの場合は、$社員番号$
という変数は文字列型にしておくのが正解です。
型にない扱い方はできない
すでに相当なボリュームになっていますが、もう一歩です!
ここまで読んできてくれた方は、例えばBot開発中にこんな状況に遭遇したとしても、理由に気がつくことができると思います。
数字型、文字列型の両方の変数を作ったのに、変数の選択肢の一覧には文字列型しか出て来ていません。
これはなぜでしょうか?
理由を探るためには、もう少し目を凝らして、変数をどのように扱おうとしているところでこの事象が起きたのか 考えてみます。
すると、この事象はメッセージボックスに表示する内容を指定しようとしている場所で起きていることがわかります。
ここで、しつこいようですが今一度、さっきの表を見てみましょう。
型の種類 | 何が入る? | どう扱う? |
---|---|---|
数字 | 1や2などの数字 | 数を数えたり、計算するときに使います。 |
文字列 | 「みかん」「りんご」などの文字 (数字が入る場合もある) |
データを単純に文字として扱いたい場合に使います。 もっとも使い道の広い型ですが、例えば以下のような使い道があります。 - ファイルやフォルダに名前をつける - Excelの番地(「A1」など)を指定する - メッセージを表示する 上記のように、「何かの名前をつける」「メッセージを表示する」的なことをしたい場合は、必ず文字列型にしておく必要があります。 また、文字列同士をくっつけたり、文字列の一部を取り出したりすることもできます。 |
「メッセージを表示する」という扱い方も、数字型にはなく、文字列型だけに許されている扱い方です。
数字型には、「メッセージを表示する」という扱い方がそもそも許されていないため、選択肢に出て来なかったのですね。
ひとたび数字型に入れてしまったら、二度とメッセージ表示はできないの?
ここまで読んだ方は、もしかしたらこんな不安を抱いたかもしれません。
「データをひとたび数字型の変数に入れてしまったら、二度とそのデータを使ってメッセージ表示したり、ファイル名をつけることはできなくなっちゃうの?」と。
そんなことはありません。
そのために、型の変換というアクションがあります。
こういうやつです。
こんな感じで使います。
型変換の応用編のやりかたとして、こんなやりかたもあります。ご参考まで。
日時の場合は?
これまで、話をシンプルにするために数字型と文字列型に絞って話を進めてきましたが、日時の場合も原則は同じです。
日時型の変数には、日時型の変数に対して許された扱い方があります。
型の種類 | 何が入る? | どう扱う? |
---|---|---|
数字 | 1や2などの数字 | 数を数えたり、計算するときに使います。 |
文字列 | 「みかん」「りんご」などの文字 (数字が入る場合もある) |
データを単純に文字として扱いたい場合に使います。 もっとも使い道の広い型ですが、例えば以下のような使い道があります。 - ファイルやフォルダに名前をつける - Excelの番地(「A1」など)を指定する - メッセージを表示する 上記のように、「何かの名前をつける」「メッセージを表示する」的なことをしたい場合は、必ず文字列型にしておく必要があります。 また、文字列同士をくっつけたり、文字列の一部を取り出したりすることもできます。 |
日時 | 日付や時刻の情報 | 日付同士の計算をしたいとき。たとえばこんなときに使います。 - 2021年5月18日の180日前の日付を求める - 2021年5月18日と1982年1月1日が何日離れているかを求める |
日時型も数字型と同様、そのままではメッセージとして表示したり、ファイル名やフォルダ名に使ったりはできません。
日付をメッセージで表示したい場合や、ファイル名やフォルダ名に日付を入れたい場合は、こちらの記事↓を参考にしてみてください。
また、そもそも日付型ってなんで必要なの? という部分を詳しく説明した記事がこちらにあるので、興味がある方は参考にしてみてください。
数字型、文字列型、日時型のまとめ
ここまで、**「変数に型が必要な理由1:入れ物を見ただけで(中身を開けなくても)どう扱えばいいのかがわかるから」**という性質を活かした型である、数字型、文字列型、日付型について説明をしてきました。
思ったより長くなってしまいましたが、ポイントを3行にまとめると以下のとおりです。
- データをどの型に入れるべきかは、データの中身で決まるわけではない(数字や日付を文字列型に入れる場合もある)
- それぞれの型には、型に対して許された扱い方がある(数字なら計算、文字列ならメッセージの表示など)
- どの型を使うべきかは、そのデータに対してどんな扱い方をしたいかで決める(メッセージの表示をしたいなら、中身は数字でも文字列型!)
このように、人間がしっかり正しい型にデータを入れてあげることで、Botはより速く、スムーズに動くことができるのです。
ここまでの説明を読んで、「結局、型ってBotの都合で分けているの?」と思った方もいるかもしれません。
たしかに数字型/文字列型/日付型の区別だけ見るとそう感じるかもしれませんが、もうひとつ、型には人間にとっても便利な性質があります。
それが次です。
変数に型が必要な理由2:たくさんの品物(=データ)をまとめてしまっておきたいときに便利だから
こちらもこの記事の中にまとめて書こうと思っていたのですが、さすがに長くなったので後編として別の記事に切り出します。
以下のツイートが元ネタになる予定です。
お楽しみに!