新刊ピックアップ

なぜ日本人はオブジェクト指向をなかなか理解できないのか?

この記事を読むのに必要な時間:およそ 1.5 分

JavaやJavaScript,PHPなど,現在人気のプログラミング言語のほとんどは「オブジェクト指向言語」という種類の言語です。ですがこのオブジェクト指向,日本人には理解しにくいと言われています。その原因は様々ですが,一番の悪者は,日本のIT教育ではないでしょうか。

変数は「箱」じゃない!

皆さんは,プログラミングの授業で「変数」について,どのように教わりましたか? おそらく,⁠変数とはデータを代入する⁠箱⁠のようなものです」といった説明を受けたと思います。実はこの説明,まったくの大嘘なのです。

この「変数」「代入」という用語ですが,数学用語からそのまま転用されています。なぜなら,プログラミングでも数学でも,同じ記号を使って数式を書くからです。例えば次の数式は,⁠xという変数に1を代入する式」または「xという名前のついた箱に1を入れる式」だと教わります。

  •  x    =    1
  •  ↑   ↑   ↑
  • 変数 代入 データ

数学だったらその説明で良いのですが,プログラムの場合は意味が通じなくなることがあります。例えば,プログラムでよく見かける次の式はどうでしょう?

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

※1)
コンピュータのメモリに入っている「データ」に,ペタリと名札を貼るようなイメージです。なお,機械語の時代は名札が貼れなかったので,データが収まっているメモリアドレス(ポインタ)を使ってデータを扱っていました。
※2)
どのデータを「オブジェクト」として扱うかは,言語によって大きく異なります。特に,数字や文字といった単純なデータ(リテラル)をオブジェクトとして扱わない言語はたくさんあります。