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」がおすすめですよ!