プログラミングにおいて、変数は必需品であり、必ず使用します。
見様見真似で漠然とプログラムを書くことも可能ですが、理屈が分からないと「あれ、今何やってるんだっけ?」とか「なんでエラーになるんだろう?」みたいに悩んでしまいがちです。
ここでは、変数と型について、他のサイトとは少し違う観点から解説していきます。
できるだけ簡単な説明にしたかったので、ある程度細かい部分は省いていますので、考え方とか概念を押さえるという意味で読み進めて頂ければと思います。
変数はデータを入れる箱
ご存知の方も多いと思いますが、これからプログラミングを始める人のために、簡単に解説しておきます。
変数とは、データを入れる箱のことです。
データとは、整数、実数、文字(1文字)、文字列(複数文字)、日付などのことで、これらを一時的に保存しておく場所が変数です。
ここで、 整数、実数、文字(1文字)、文字列(複数文字)、日付 というデータが登場しましたが、例えば以下のようなものです。
整数 | 小数点の無い数値。100,150,-30,28000 など |
実数 | 小数点のある数値。0.0053,-3.28,1005.32,3.1415926 など |
文字 | 単独の1文字。a b c # % など |
文字列 | 文字が2個以上集まったもの。 abc C#%a12% など |
日付 | 日付(時分秒含む)をあらわすもの。2020/02/02 2020-11-15 13:12:56 など |
データの種類のことを「型」と呼ぶ
プログラミングでは、 整数、実数、文字(1文字)、文字列(複数文字)、日付 のデータについて、それぞれ別々の種類として扱います。
この種類のことを「型」とか「データタイプ」とか「データ型」と呼んでいます。
では、単純に変数にデータを入れれば良いかというと、決してそんなことはなく、実は入れ物にも「型」があります。
入れ物(変数)にも「型」がある
入れ物=変数にも「型」があって、データが整数型なら整数型の変数へ、データが文字列型なら文字列型の変数へと、入れるデータと入れ物の「型」を合わせないと 入ってくれません。
もし、異なる「型」のデータを変数に入れるプログラムを書くと、エラーになってプログラムが止まってしまいます。
何故「型」が必要なのか
では、何故「型」という考え方が必要なのでしょう。
何でもかんでも気にせず変数に入れてしまえれば楽ですよね。
現実に、変数の型を気にしない言語も存在します。
型が必要な理由は、「変数に入れたデータを正しく取り扱う際、型が必要だから」ということになります。
ちょっと難しい話になるかもしれませんが、コンピュータは数値しか処理出来ません。
整数や実数、文字列や日付など、多くのデータ型が存在しますが、この型ごとに必要なメモリ消費量が決まっています。
データがメモリに格納される際、数値も文字も日付も全て16進数に変換されます。
(実際には、コンピュータは16進数を2進数として解釈して動くのですが、ここでは割愛します)
「型」というのは、メモリに格納された16進数を、「これは整数として扱ってね」とか「これは日付として扱ってね」という風にコンピュータに指示するためのものなんです。
だから、数値として入れたつもりなのに、コンピューターが文字列として認識して誤動作するという事を防ぐため、「型」が存在し、それを使うのです。
中身を変更できない変数「定数」
さて、変数は入れ物なので、型さえ合わせておけば、色々な値を入れる事ができます。
言い換えると、プログラムのミスで、変えてはいけない変数の値を変えてしまうという事故も発生し得る訳です。
プログラムが複雑になると、この様な事故が発生しても、原因がなかなか特定できません。
なにしろ、プログラム的には間違っていないわけですから、エラーの出しようが有りませんよね。
そこで、このようなミスを防ぐため、プログラムの最初に値を設定したら、その後は変更できない変数というのが用意されました。
これが「定数」というものです。
定数を使うことで、上記のようなプログラムミスをエラーとして検出できますし、この変数の値を後日変えたくなった場合、最初にこの変数に値を入れたことろだけを変更すれば済みますので便利です。
変数の「型」を自分で作る
実は、新しい「型」を自分で作ることが出来ます。
変数の「型」はとんでもなく多い
ここまでの説明では、整数、実数、文字、文字列、日付に関する型が登場しました。
実は、数え切れないくらいの「型」が存在します。
無数と言っても過言ではありません。
例えば整数を1つ例にとると、入れる値の最大値(メモリを消費するサイズ)や、符号(プラスマイナス)の取り扱いによって4種類存在します( プログラミング限度によって増減します) 。
何故、整数を扱うのに4つの種類が存在するのかについては、メモリを節約するためです。
昔はメモリが少なかったので、必要以上にメモリを消費しないことが大切だったんですね。
変数はデータ以外も格納できる
ここまでに、変数はデータの入れ物だと説明してきました。
で、突然データ以外も格納できるとは、何たるこっちゃ!
と思われた方もいらっしゃると思います。
オブジェクト指向のプログラミング言語では「クラス」というものがあって、これも変数に格納できます(厳密に言うと少し違いますが、詳細はここでは割愛します)。
クラスとは、データ(プロパティ)とプログラム(メソッド)を1つに合わせたものです。
クラス以外のプログラム(関数やイベントハンドラ)も格納できます。
オブジェクト指向についてはこちら、関数、イベントハンドラについての詳細は、こちらをご覧ください。
クラスもプログラムも、実際にはメモリのどこかに置かれています。
この場合の変数は、クラスやプログラムが置かれたメモリ上の場所を入れるための役割になります。
では、この場合の型はどうなるのでしょう?
場所が格納されているのであれば、どんなクラスであろうとも、どんなプログラムであろうとも、同じ「型」の変数に入りそうなものです。
でも、実は違います。
クラスもプログラムも、「型」をちゃんと指定しなければなりません。
それは、クラスごとに、内部に持っているデータ(プロパティ)やプログラム(メソッド)に渡す引数が異なるからです。
プログラム(関数)だけを変数に格納する場合でも、プログラムに渡す引数がそれぞれ事なります。
上記の理由から、クラスやプログラムについても、正しく「型」を指定する必要があるのです。
型は自分で作るもの
オブジェクト指向では、クラスを作るという作業を多用します。
オブジェクト指向において、プログラムは単体で存在するのではなく、かならずクラスの中の1つの要素として記述します。
だから、プログラムを作るという行為は、型を作るという行為でもあります。
もちろん、プログラミング言語に初めから備わっている型(整数、実数、文字、文字列、日付など)が一番多く使いますが、それ以外に、自分で作ったクラスが出来上がるたびに、それを入れるための新しい「型」も出来上がります。
まとめ
- 変数はデータを入れるための入れ物
- データには「型」がある
- データと入れ物の「型」を合わせないとエラーになる
- 「型」はメモリに格納されたデータを正しく扱うための情報
- 変数にはデータ以外(クラス、プログラム)も格納できる
- プログラムを作るとは型を作るという行為でもある
以上です。