値は どこに あり 名は 何を さすか、メモリと参照
プログラムが 動いている あいだ、わたしたちが 作った値は どこかに かならず 入って いなければ なりません。 その場所が、メモリです。 番号の ついた ロッカーが ずらりと ならんだ 壁だと 思って みて。 名は、その中の どの ロッカーを さす メモなのです。
値は どこかに 入って いる
プログラムが 動く あいだ ずっと、
すべての値は メモリの どこかに 場所を とります。
メモリは、番号の ついた ロッカーが ずらりと ならんだ 壁の ようです。
値を 一つ 作ると、空いた ます一つに すっと 入ります。
プログラムは 値を「何番の ます」で おぼえます。
「値を入れる」を押して。空いた ます一つに 値が 入り、ます番号が 見えます。
値ごとに、自分の ますと 番号が できましたね。
でも コードでは「7番の ます」とは 書きませんよね?
「a」「点数」のような 名を 書きます。
その名と、ます番号は、どう つながるのでしょう?
名は、場所を さす
名は、値 そのものでは ありません。
「どの ますか」を 知っている メモです。
名「a」→ 3番の ます → その中の 7。
だから「a」を 使うと、プログラムは メモを たどって
3番の ますを あけ、7を 読みます。これが「さす」と いうことです。
名「a」を 押して。メモを たどって ますへ 行き、中の値を 取り出します。
名が ますを さし、その ますの中に 値が あります。
この「さす メモ」を 参照と 呼びます。
さあ、ここからが 本当に 大事です。
「a を b にも わたす」と 言うと、何が 起きるでしょう?
小さな値は コピーされる
数のような 小さな値を b に わたすと、
その値は 新しい ますに そのまま 複製されます。
これで a は 3番、b は 5番。べつべつの ますです。
だから a を 9に かえても、b は 7の ままです。
二つは、それぞれ 自分の値を 持つ 独立した 間がらです。
「b にコピー」のあと「a を かえる」を 押して。b は べつの ますだから 変わりません。
コピーされた 小さな値は、たがいに えいきょうしません。すっきりです。
でも オブジェクトのような 大きな ものは、事情が ちがいます。
大きな ものを まるごと 複製するのは 重いのです。
だから たいてい、コピーの かわりに 別の ことが 起きます。
大きな ものは、場所を いっしょに さす
オブジェクトを b に わたすとき、オブジェクト全体を 複製せず、
たいてい b も 同じ ますを さすように します。
これで a と b、二つの メモが 一つの ますを いっしょに さします。
だから a で その オブジェクトを なおすと、
b で 見ても 同じに 変わって います。一つの ものに 名が 二つ だからです。
二つの名が 一つの ますを さすので、一つを なおすと どちらも 変わります。
プログラムを はじめて 学ぶとき、いちばん よく おどろく ところです。
「なぜ さわっても いない b が 変わったの?」
もう その答えが わかります。同じ ますを さして いたからです。
何を さすかが わかれば、もう まよわない
まよいの 正体は、いつも 一つです。
名が 自分の コピーを 持つのか、一つの ものを いっしょに さすのか。
小さな値なら コピーだから べつべつに 動き、
大きな ものなら 場所を いっしょに さして いっしょに 動きます。
この 区別さえ 思い出せば、おどろくことは なくなります。
「小さな値」と「大きな もの」を えらんで、同じ ことを させて。結果が 分かれるのが 見えます。
ここまでが、プログラミングの 土台です。
値 一つから はじめて、まとめ、くりかえし、名を つけ、
オブジェクトに まとめ、デバッグで なおし、機械に まわさせました。
そして いま、その すべてが どこに 入って いて、
名が 何を さすかまで 見ました。しっかりした 土台が できました。