プログラムの勉強を始めて、概念として一番最初に学ぶのは「変数」じゃないでしょうか?
「変数とは何ですか?」と聞かれた際に、どのように説明を行いますか?
私は「数字を覚えておくための箱のようなもの」と説明することが多いです。
C言語の本などにもそのように書かれていることが多いです。
メモ用紙のようなものだったり、他言語によっては名札のようなものだったり、たとえ方は色々あります。
概念を理解するには、受け手がイメージしやすいもので、さほど遠くない例えから入るのが分かりやすいです。
変数を正しく理解しようとすると「メモリ」という知識と理解が必要になり、学習コストが上がってしまい、挫折しやすくなってしまうからです。
なので最初は、まぁ何となくそういうものとして段階的に詳しく理解していくことが大事です。
さて、「変数は数字を覚えておくための箱のようなもの」と説明する際に、以下のような図で説明されていることがあります。
一番最初の説明ならこれでも良いかもしれませんが、理解を少し進めていくと壁にぶつかります。
それは…
箱の中は空じゃないよ!
ってことです。
実は数字を覚えるための箱の中には、作った際に既に何かしらの数字が入っているのです。
そしてその数字は箱の中から見たり書き換えたりすることは出来ても、取り出すことはできません。
つまり箱の中を空っぽにすることは出来ません。
NULLがあるじゃないか、と思われる方もいるかもしれませんが、NULLも空を表す数字が入っているにすぎません。
つまり箱の中の数字を10にするには、箱の中の数字を書き換える(コピーする)必要があります。
「変数iに10を入れる」なんて言い方をするので、混同してしまうのかもしれませんね。
さて、この捉え方の違いが、どういう壁になるのでしょうか?
まずはコストの問題です。
例えば、AとBという2つの配列があります。
AとBは同じ型の同じサイズの配列ですが、中に入っている数字は違います。
もう一つ同様の配列Cを用意して、条件に応じて、AとBのどちらかを代入します。
このとき、配列Cは、AかBのどちらかと同じになります。
でも配列Cはコピーなので、厳密にはAでもBでもありません。
中身は一緒でもコピーなのです。
なのでコピーするという作業が内部で発生します。
これがコストですね。
でも、そもそもAとBどちらかをそのまま使えばコピー代が浮きますよね?
でも処理はまとめたい。
そんな時に出てくるのがポインタという新しい概念なのですが、それはそれで置いておいて…
次にクラスの場合です。
コピーということは、同じクラスがもう一つ作られるということです。
つまりコンストラクタが走ります。
そして何も考えずに中身をコピーしてしまうと、例えばnewしたポインタなどをメンバ変数で保持している場合、元のクラスでdeleteして変数をNULLにしたとしても、コピーしたクラスのメンバ変数は前のままです。
そのまま使ってしまうと、最悪暴走してしまいます。
(たまたま動く場合もある)
という感じで、複雑なことをしていこうとすると、もう少し正しく概念を理解する必要が出てきます。
さて、みなさんは変数にどんなイメージを持っていますか?
ちなみに最近は少なくなってきたような気もしますが、「おまじないみたいなもの」と説明するケースがあります。
意味はあるんだけど、本質じゃないから今はそういうものとして認識して、という場合に使われるものです。
私はこの言い方、あまり好きではありません。
プログラムに非論理的な説明を混ぜるのは、不必要なイメージを植え付けかないというか、非科学的だし、みたいな。
コメント