6

 ここで、ことり先輩はアイスコーヒーをストローで飲んだ。

 ちなみに、グラスの中にはミルクが2杯注がれている。彼女は甘いものが好きなようだ。

「さて、ここからが本題です。

ここで計算結果を記憶するメモリ、プログラミングの世界では<変数へんすう>と言います。

アプリの中に小さな領域の箱が作り出されるイメージです」

 僕は小さな段ボール箱をイメージしてみた。そしたら、その中に結果を書いた紙を投函するのだと教えてくれた。

「書いたプログラムを動作させる、つまりユーザーがアプリを操作している間は、処理されている内容や記憶するメモリというのはころころと変化していきます。

1と2を足したとき、さらに3を足したとき......。

計算結果を書き込む紙は、その都度、なんども書き直されているわけだよ」

 この話題をプログラムで書くとこうなるのだという。

 彼女はこう言って、先ほどの処理イメージを描き直した。


*───────────────────

int result; //計算結果のメモリを用意する


イコールボタンを押すまで繰り返し:

  1のボタンが押されたら:

    result = result + 1; //メモリに 1 が加算される

  2のボタンが押されたら:

    result = result + 2; //メモリに 2 が加算される

  ...


Print result; //メモリに格納されている計算結果を表示する

────────────────────


「まず、最初の1行は"result"っていう名前の変数を使いますって<宣言する>んだ。

int て言うのは、変数の型の種類だよ」

 まず、段ボールにマジックで"result"という単語を書くようなイメージが浮かんだ。そして、型と聞いて手本・パターン・タイプ。色んな考え方を頭で想像してみる。

「この場合は"タイプ"ね。

さっきも言ったようにメモを入れる箱、その種類だと思えばいいよ。

int は"integer"っていう意味の英単語からきているから整数のこと、他にもstring は文字列。

あと、アプリのボタンやゲームのキャラクターなども型になりえるよ」

 へえ。そんなこともあるんだ。

「"result"という変数には計算結果を記憶するための意味がある。

意味があるから、用途が決まるってこと。

そう、変数名は用途にちなんだ名前にするのよ。

本にはあまり書かれていないけどさ、他人が見て分かる必要があることが大切なんだ。

適当な名前を付けている人がいたら、私はその人を蹴るわ」

 あっさりと物騒なことを言いだした。

「result = result + 1; の部分は、現在のresultの値に1を加算した数字に書き直して新たに投函する、みたいなイメージ。

つまりは値の上書きだね」


 ここまでは納得できた。でも、なんだろういまいち実感が湧いてこない。

 おずおずと手を上げながら聞いてみた。

「しい君、なあに?」

「なにかの記録のために使うのは分かったんですけど、記録する必要がない場合には使わなくても良いっていうことでしょうか」

 なるほど。

 ことり先輩は少し考える仕草になった。

「変数を使わなくてもアプリはできるけど、ただそれはアプリを起動しても何も表示されないから、味のしない料理を食べるようなものだよ」

 例えがよく分からないけれど、彼女の言わんとしていることが分かった気がする。それでは何も遊べない。

「さっき、ゲームのキャラクターが変数になるって言ったけど。

文字列や数字だけじゃ、ゲームの中ではほんの小さな断片みたいなものでさ。

赤ずきんの位置や名前は表せても、その子自体は表現できないんだよ」

 ......だから、作ってあげるんだ。

 僕の頭の中に、赤ずきんの姿が、彼女が歩く森のフィールドが思い起こされた。まるで、ことり先輩が壮大な世界を作り上げているようだった。

 いつか、そんなゲームができるのだろうか。

 

「じゃあ、変数を使う意味を教えてあげようか」

 ことり先輩はテーブルの上に置かれているキャンディを手のひらにひとつ乗せて、僕の方に見せてきた。

「どちらに乗っているでしょうか?」

 と言われても、どこからどう見ても彼女の右手の方だ。

 彼女の表情を覗いてみても、くすくすと笑っているだけだ。何がしたいのかよくわからない。

「まあ、誰だってわかるよね。

さて、このキャンディを左手に移すとする。もちろん右手からは無くなるわけだ。

この時の挙動をプログラム的に表すとこうなるんだ」


*───────────────────

右手 = "キャンディ"

左手 = " "

────────────────────


 "右手"と"左手"という、ふたつの変数を宣言するとする。

 右手には持っているという意味を示す"キャンディ"という文字列が設定されている。対して、左手には何も設定されていない。

 キャンディを右手から左手に移すことを、右手の変数という内容を左手に代入することで再現する。


*───────────────────

左手 = 右手

────────────────────


 このときの挙動は、右手の内容を左手にコピーするようなものだ。

 そのため、右手にも左手にもキャンディという文字列が設定されている状態になってしまう。

 右手の内容を改めて何もないという状態に設定しないといけない。


*───────────────────

右手 = " "

────────────────────


 ここが理解できたところで......、とことり先輩は話を進めた。

「ではでは、このキャンディは何味でしょうか?」

 僕はその包み紙に目を落とす。ミルク味のキャンディだ。

 彼女は右手にそのキャンディがある状態で、左手に新しいものを取った。それはレモン味のようだ。

「さて、では問題です。

私は今両方の手にそれぞれの味をしたキャンディを手にしています」

 ......これを入れ替える処理はどうなるでしょうか。彼女はそう言って、含みがあるような笑みをした。

「......えっと、右手を左手に移したところで、両方の味を持っている?」

「人間ならできるんだけどね。

ひとつの変数には、"ひとつの情報を扱うことしかできない"から、その処理は実行されたりはしない」

 首をかしげながら答える僕に、ことり先輩はかすかに首を横に振った。

「さっきの処理を思い出してください。

右手を左手に代入すると、どうなったっけ?」


*───────────────────

左手 = 右手

────────────────────


 この処理のことだ。これが実行されると、右手の内容が左手にコピーされて上書きされてしまう。

「あ、そっか......。

左手にある"レモン味"は右手、つまり"ミルク味"に書き換わっちゃうんだ」

 そうなの、とことり先輩はゆっくり頷いた。

「だから、左手のレモンちゃんをまずはどうにかしないといけないわけだ」

 つまり、どうすれば良いのだろうか。

 それを解決するために、彼女はよく見ててねと僕に告げた。


 ことり先輩は左手に乗せているレモン味のキャンディをテーブルの上にぽとりと落とした。

 そして、右手のミルク味を左手に移す。

 右手に何も乗せられていない状態で、テーブルの上にあるレモン味を取り上げた。


 つまり、次のようにプログラムを記述することができる。


*───────────────────

右手 = "ミルク味"

左手 = "レモン味"

テーブルの上 = " "


//左手のキャンディから順次移していく

テーブルの上 = 左手

左手 = 右手

右手 = テーブルの上

────────────────────


 このように変数を交換することを<スワップ>といい、よく使われる手のひとつだという。

 この時、"テーブルの上"という変数は"まず何もない状態"からはじまり、一時的に退避するために扱われるという。テンポラリーみたいな意味合いだ。

「こうやって記述することで、手のひらにどんな味のキャンディがあったとしても対応できる。

このようにひと手間考えながらプログラムを書くんだ。

でも、その分組み合わせ次第でさまざまな処理を作り上げていくことができるんだよ」

 こうやって変数はさまざまな処理を実現するために使われる。必要に応じて、必要な分だけ宣言して使っていくことが大切だ。


 ことり先輩はもうひとつと言って、コーヒーを題材にした小さなコードを書いてくれた。

「例えばさ、今消費税って高いじゃん。

このコーヒーひとつでも高いよねぇ......っていうのは置いといて。

3つの商品に消費税を掛けるのはこんな感じに書くとする」


*───────────────────

商品1の金額 * 10%

商品2の金額 * 10%

商品3の金額 * 10%

────────────────────


「でも、消費税っていつかは上がるじゃん。

それを全部直すのは大変だよね」

 ことり先輩は少しコードを直していった。でもひとつだけ何もしていない。


*───────────────────

商品1の金額 * 12%

商品2の金額 * 12%

商品3の金額 * 10%

────────────────────


 あ、先輩最後の行だけ......。と僕は言おうとして気づいた。

 彼女はわざと直さなかったわけだ。つまり、誰だって修正を忘れてしまう可能性がある、ということになる。

 あらかじめ変数taxとして宣言することで、今後増税しても変数に代入する数値だけ変えていけばよい。


*───────────────────

tax = 10% //ここの値だけを直せばいい


商品1の金額 * tax

商品2の金額 * tax

商品3の金額 * tax

────────────────────


 ことり先輩は微笑んで答えた。

「そう、こういう時に変数を使うんだ。

できる限りメンテナンスが簡単になるようにする、それがプログラムを書く上での目指す姿なんだよ」

 なるほど。

 使い方が大事なのだろう、ついつい頷いてしまった。


 彼女はここでは終わらず、変数taxを宣言する箇所を次のように書き直した。


*───────────────────

 final TAX = 10%

────────────────────


「変数名の前に"final"を付ける。

これは一度内容を決めると、もう書き換えられない」

 <定数>って言うんだ、そう教えてくれた。そういうの、不便じゃないのだろうか。

「ううん。"これは消費税の変数だ"ということを印象付けるときに使うんだ」

 なるほど。

 僕は少し顎をひいて、考えてみた。

「プログラムの中で、特定の変数やキーワードを目立たせたいときに使うの。

消費税を掛けていますよ、っていう風にね。

大文字にするのはルールのひとつだけど、こういう書き方を少しするだけで良い味付けになるんだ」

 美味しいご飯になるように、腕を掛けた書き方をしたいんだ。そう語る彼女がなんだか素晴らしく見えたのだった。


 ・・・


 その日の週末、僕は和也の家を訪れていた。

 彼はテレビと接続する据え置き型のゲーム機にソフトの円盤を挿入している。

 今日遊んでいるのは、<アーマード・アイリス>というメカアクションゲームだ。素体となる美少女の形をしたロボットに腕や脚などの外装パーツと武器を装着して戦うことができる。組み合わせによって耐久性や移動速度、戦い方が変化する。

 その可能性はカラーリングを施すところまで含めると何億通りとも言われている。

 RPGでいうところの"勇者の剣"みたいな約束された強さを持つアイテムが存在せず、どのパーツも武器も一長一短がある。自分だけのお気に入りな機体を模索してアクションを行うのがこのゲームの醍醐味だ。

 コントローラーを操作して対戦で使いたいパーツを選んでいった。その中で、僕はあることに気づいたのだ。

「そうか」

 気づかないうちに小さなつぶやきをした。

 耐久値は外装パーツの合計値で計算されている。移動速度は全身の重量で決まる。これらは変数の内容が変わっていくからだ。

 和也が攻略本を読みながらちらっとこちらを見た。彼は少しにやにやしているようだ。

「なんか楽しそうだな」

「ん? なんでもないよ」

 僕はコントローラーを操作して、対戦を開始した。

 ことり先輩はこう言っていたんだ。じゃあこれはどうやって作られるのかなって。

彼女の気持ちが分かった瞬間に、少し口角が上がっていた。

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る