JavaやJavaScript、PHPなど、現在人気のプログラミング言語のほとんどは「オブジェクト指向言語」という種類の言語です。ですがこのオブジェクト指向、日本人には理解しにくいと言われています。その原因は様々ですが、一番の悪者は、日本のIT教育ではないでしょうか。
変数は「箱」じゃない!
皆さんは、プログラミングの授業で「変数」について、どのように教わりましたか? おそらく、「変数とはデータを代入する“箱”のようなものです」といった説明を受けたと思います。実はこの説明、まったくの大嘘なのです。
この「変数」や「代入」という用語ですが、数学用語からそのまま転用されています。なぜなら、プログラミングでも数学でも、同じ記号を使って数式を書くからです。例えば次の数式は、「xという変数に1を代入する式」または「xという名前のついた箱に1を入れる式」だと教わります。
数学だったらその説明で良いのですが、プログラムの場合は意味が通じなくなることがあります。例えば、プログラムでよく見かける次の式はどうでしょう?
「xという箱に入っているデータに1を加え、計算結果をさらにxという箱に入れる…」と説明することはできますが、同じ箱が複数出てくるところで論理が破綻してしまいます。
こうなってしまう原因は、そもそも「代入」という日本語自体が間違っているからです。
「=」は「代入」じゃない!
数学用語の「代入」は、英語の「substitute」を和訳したものです。substituteは「代わりにする」という意味なので、妥当な訳ですね。しかし、IT用語の「代入」は、英語では「assign」という単語です。assignを直訳すると「割り当てる」なので、意味がまったく違います。
「=」を「割り当てる」と訳してみると、先ほどの数式を日本語でうまく説明できます。「x = 1」は「1にxを割り当てる」ですし、「x = x + 1」は「xが割り当てられたデータに1を加えたものに、xを割り当てる」となります。ちょっと冗長ですが、このほうが意味がしっくりときますね[1]。
なぜ英語のassignを代入と訳したのかは今となっては不明ですが、おそらく、初めてプログラミングの「=」を解説する際、面倒なんで数学の「代入」をそのまま流用しちゃったんではないでしょうか。
箱とか、代入とか、
最初に言い出したのは誰なのかしら?
そもそも「変数」って何?
実は、誰かさんがassignを代入と訳したとばっちりで、日本人は「変数」の意味までも誤解してしまいました。変数も、数学とITでは意味が異なるのです。
「変数」は英語で「variable」なので、日本語に直訳すると「変化するモノ」になります。数学でもITでも意味は同じですが、この「モノ」の解釈が異なります。数学ではモノは「数」ですが、ITでは「データ」のことを指します。この解釈で、先ほどの「x = 1」という式を日本語に訳してみると、「1という変数(データ)にxという変数名を割り当てる」になります。また、これを式に当てはめると、次のようになります。
つまり、「x」はあくまで変数の名前に過ぎず、変数の実体とは「データ」そのものなのです。
あ…ありのまま 今起こった事を話すぜ!
『おれはデータを変数に代入したと
思ったらデータが変数だった』
変数とオブジェクト指向
オブジェクト指向では、「データ」を「オブジェクト」として扱いますので、「変数」もまた「オブジェクト」と同じものだと言えます[2]。
そう考えることで、オブジェクト指向の様々な概念(プロパティ、メソッド、インスタンス等)も、すっきりと理解できるようになるでしょう。オブジェクト指向プログラミングでは、変数を作り、その変数に様々な機能や処理を加えることで、プログラムを作っていくからです。
変数の前に道はない
変数の後ろに道は出来る
これからオブジェクト指向言語を学ぶ方は、ここで紹介した「変数とはオブジェクトのこと」というイメージを胸に、学習に臨んでみてください。それだけで、理解度が多少なりとも変わってくると思います。それと、初めて学習するなら言語は「Python」や「Ruby」がおすすめですよ!