変数は、プログラミングを勉強し始めると初日に出てくるような、基本的な概念です。だからといって、単純なものではありません。
例えば、次のような問いに答えられるでしょうか?
変数はコンピューター上のどこにあるのか?
変数の役割は?
変数の有効範囲は?
この記事では、こういった変数に関する基本情報を初心者の方にもわかりやすく解説します。また、変数の命名法という、非常に重要な話題についても詳しく述べます。
変数とは
プログラミングをしていると、ある計算結果などを別の場所でも使いたいことがよくあります。そういうときに便利なのが、変数です。
プログラミングにおける変数とは、簡単に言えば「一時的なデータの保管場所に名前を付けたもの」と考えることができます。
ここでいう保管場所というのは、メモリー(RAM:Random Access Memory)上の領域のことです。メモリー上に場所を確保して、そこに計算結果などのデータを格納するのです。その際、あとで参照するときにわかりやすいように名前を付けておくという要領です。
変数の役割
変数は、コンピューターの側から見ればメモリー上の一領域に過ぎませんが、人間側から見るととても大きな意味があります。その役割は主に、何度も同じことをしなくて済むようにすることと、コードを読みやすくすることです。
値の入れ物
変数とは、データの入れ物です。メモリーという、読み書きは非常に速くできるけれどもプログラムが終了したりコンピューターの電源を落としたりすればデータが消えてしまう場所にあります。
つまり、変数とは「データを一時的に置いておく場所」です。
同じ計算を何度もしない
変数は、値の使い回しに使えます。プログラムの中のある場所で計算した結果を別の場所でも使いたい場合は、変数に格納しておけば何度も計算し直す必要がなくなります。
値の意味をはっきりさせる
ある値がいったい「何」なのか、はっきりさせるのも変数の役割です。
例えば、商品を扱うプログラムで、ある値段が税抜き価格なのか税込み価格なのか、といったことを区別するのに、変数に名前を付けることで対応するのです。
この、「変数に名前を付ける」という話はとても重要なので、後ほど詳しく解説します。
変数と定数
変数に似たものに、定数があります。その違いは、変数が「プログラムを実行するたびに変わる可能性のある値」であるのに対し、定数は「いつでも同じ値」であることです。
例えば、「税込み価格」を計算するプログラムを書くとしたとき、「消費税率」を定数として、「税抜き価格」や「税込み価格」を変数とすることが考えられます。消費税率は当面変わらないものであるのに対して、値段はどの商品の値段を計算するかによって、毎回違うからです。
データ型
コンピューターで扱うデータには、「型」があります。プログラマーは、それをはっきりと意識しておく必要があります。
変数を扱うときには、その変数が保持するデータがどんな型なのかを知っていなければなりません。そうしないと、プログラミング中、しょっちゅうエラーに悩まされることになるかもしれないからです。
データ型をどれくらい意識しなければならないかは、プログラミング言語によって違います。また、採用されているデータ型も、言語によって違いがあります。
主なデータ型
プログラミング言語でよく扱われるデータ型には、「数値」や「文字列」、そしてそれらをまとめて扱うための「配列」といったものがあります。もっといろいろあるのですが、ここでは基本となるその3つを解説します。
数値
数値は、プログラミングで扱うデータの中でも最も基本的なものと言ってよいでしょう。高速な数値計算こそが、コンピューターの最大の強みだからです。
数値型の中にも、さらにいろいろな型が含まれています。整数型や桁数の多い整数型、そして小数点付きの数である浮動小数点型などです。
整数型と整数型など、型が一致する数同士の演算はスムーズに行われます。また、整数型と浮動小数点型など、多少型が違う数同士でも、自動的に型変換を行って演算してくれる言語もあります。
文字列
文字列も、コンピューターを使うのに欠かせないデータです。Web関連のプログラミングなどでは、大量の文字列処理を行うことになります。
文字列は、基本的なデータ型でありながら、その扱いはかなり複雑です。日本語や英語など、様々な言語を正しく表示するための「文字コード」にはたくさんの種類があり、正しく選択するのはなかなか大変な問題です。
配列
たくさんのデータをまとめて扱うための「配列」も、非常に重要なデータ型です。
配列という仕組みがあるおかげで、たくさんのデータをひとつの変数で表すことができ、プログラムをシンプルにすることができます。
静的型付け言語と動的型付け言語
データ型の扱いについて、プログラミング言語を「静的型付け言語」と「動的型付け言語」に分けることができます。
静的型付け言語では、変数用のメモリー領域を確保して変数名を付けるときに、そのデータ型を指定します。例えば、整数型なら整数型、文字列型なら文字列型と指定して、変数を「宣言」するわけです。
一方、動的型付け言語では、特にデータ型を指定する必要はなく、いきなり変数に値を入れることができます。
変数の使い方
変数を使うには、メモリー領域を確保して名前を付け、データを入れて、どこか別の場所で参照する、というような手順を踏みます。そのやり方は、言語によって違います。
宣言
静的型付け言語では、ほとんどの言語で、変数を使いはじめるときにデータ型を指定する「宣言」という過程を経ます。
例えば、C言語で整数型の変数「num」を宣言するときには
int num;
のように書きます。
一方、動的型付け言語では、データ型を指定する必要はなく、宣言なしに使いはじめることができます。その際、変数にいきなり値を代入することになります。
代入
代入とは、名前を付けた変数に値を入れることです。確保したメモリー領域にデータを格納するわけです。
多くの言語で、代入には「=」という演算子を使います。例えば
num = 1
とすれば、変数numに1という値を代入したことになります。
静的型付け言語では、変数の宣言をする前に代入してしまうとエラーになります。動的型付け言語では、宣言の必要はないので、いきなり代入しても大丈夫です。
「=」は、多くのプログラミング言語では「代入演算子」であり、数学の等号とは異なります。「=」の左右がイコールである、という意味ではないのです。
例えば、
int num;
num = 1;
num = num + 2;
というようなコードが、プログラミング言語では成り立ちます。最後の行は、数学の式だとしたら有り得ないのですが、プログラミングの代入なので、正しい文なのです。このコードでは、最終的にnumの値は3になります。
参照
変数は、どこかで参照されて初めて役に立ちます。
宣言や代入が済んでいる変数をそのあとのどこかに登場させれば、それがその変数の中身であるデータを参照することになります。
int a, num;
num = 1;
a = num + 10;
このようにすれば、変数 a に11という値が入っていることになります。最後の行では、numに入っている1という値が参照されています。
変数のスコープ
変数には、プログラム中のどこからでも参照できる大域的なものや、ある関数の中など、特定の範囲でしか参照できない局所的なものがあります。
それらを、それぞれ「グローバル変数」と「ローカル変数」と呼びます。
グローバル変数
グローバル変数は、プログラム中のどこからでも代入や参照ができる変数のことです。
どこで値を書き換えたかわからなくなりがちなので、グローバル変数を多用するのは危険です。
ローカル変数
ローカル変数は、ある特定の関数内などだけで有効な変数のことです。その有効範囲はプログラミング言語によって異なります。
スコープが狭いため、値の変化が追いやすく、コードが明瞭になりやすくなります。同じ処理をグローバル変数でもローカル変数でも表現できる場合は、迷わずローカル変数を使うべきです。
変数名の付け方
プログラミングをしていて、変数に関して一番気を使うのは、名前の付け方です。どう使うかよりも、どう名前を付けるかのほうが、より重要なことも多々あります。
変数を使って計算など何らかの処理をするのは、プログラミングに慣れてくればだんだんと簡単になっていきます。しかし、変数に名前を付けるのはいつまでたっても難しいものです。プログラムが長くなればなるほど、数多くの変数が必要になりますから、それだけ頭を悩ます時間も長くなります。
適切な名前の付け方は、言語の文法的なことを学んだだけでは身につきません。先人達の知恵に学び、実践で経験を積む必要があります。
ここでは、変数名を考えるときに従ったほうがいい原則を紹介します。なお、プログラミングでは、あらゆる名前は英語で付けるのが一般的ですので、例は全て英語になっています。
それが「何か」を明確に表す
変数名で一番大事なのは、その変数が「何」なのかを明確にすることです。
一読して意味がわかるような変数名が理想です。日付を表すデータなら「date」、値段を表すなら「price」など、ひねらずストレートに付けましょう。
「最初の日付」とか「最安値」のように、詳しく名前を付ける必要があるときには、「first_date」や「lowest_price」などのように、単語を連ねることもできます。これを、例えば「fd」とか「lp」などのように省略してしまうと、後々わけがわからなくなる可能性が高くなります。
名前が明瞭であることは、他の人と一緒に開発するときなど、コードが自分以外の誰かに読まれる場合には当然重要になります。
また、自分1人だけで作っているプログラムの場合でも、日にちがたつと自分が書いたコードの内容などすっかり忘れてしまうものです。そのときに、過度に省略したりした変数名を使っていれば、自分で書いたのにもかかわらず意味がわからなくなってしまう可能性があります。
可読性・視認性に配慮する
プログラムは、書くものであると同時に読むものです。よって、読みやすいことがとても大事です。変数名も、そのことを意識して考える必要があります。
意味を明確にするために変数名を詳しく書くのは結構なのですが、あまりに長くなってしまうとかえって読みにくくなります。時には、適度に省略した名前にすることも必要です。
例えば、ループを回すときのインデックスは「i」 や「j」で表すのが一般的です。「index」と書いたほうが意味は明瞭ですが、一文字「i」と書いたほうが見やすくなります。C言語系の例を示すと
for(int i = 0; i < 10; i++) {
…..
}
というような具合です。このような決まり切った書き方の場合は、わざわざ長い変数名を使わなくても意味が明瞭に伝わります。
同じものには同じ名前
例えば、「値段」を表す変数名として「price」を選んだなら、値段は全て「price」で表すべきです。所々「price」の代わりに「value」を使っていたりすると、それらに何か意味的な違いがあるのかと思われてしまいます。
また、単語を短縮するようなときにもこれは当てはまります。「文字列」を表すのに「string」を短くした「str」という変数名を使ったとしましょう。そうしたら、そのプログラムではどこでも、「文字列」を表す変数は「str」で統一すべきです。あるところでは「string」、またあるところでは「s」というように、書き方がバラバラだと、とても読みづらい、美しくないコードになってしまいます。
コーディング規約に従う
プロジェクトの一員としてプログラミングをする際には、何らかのコーディング規約に従ってコードを書くのが一般的です。変数名などに関してもそれに則って付けることになります。
例えば「newPrice」のような「キャメルケース」や、「new_price」のような「スネークケース」で変数名を書くように決まっていることが多いようです。
一人で行うプロジェクトであっても、こうしたコーディング規約を導入してコードに統一感を持たせるのは、とてもよい習慣です。
まとめ
プログラマーにとってとても身近な存在である変数について掘り下げました。プログラミング学習のごく最初のほうに出てくるものでありながら、とても奥の深いものでもあります。この機会にしっかり学んでおきましょう。