1.3 変数
もうしばらく座学は続きます。
「じゃあ、int以外の変数のジャンル……変数のジャンルのことを『型』というんだが、他の型について、教えるぞ」
俺は、新しい魔石に、魔法ではなくメモを書いていった。
byte とても小さな整数を扱う型
short 小さな整数を扱う型
○int 普通の整数を扱う型
long 大きな整数を扱う型
float 桁の小さな小数を扱う型
○double 小数を扱う型
char 文字(一文字だけ)を扱う型
○String 文字列を扱う型
boolean 真偽(true, false)を扱う型
この魔石、魔法じゃなくメモも書けるのは本当に便利だな……。しかも、文字を念じるだけで書くことができるなんて。俺は魔石に感心しながらも、説明を始めた。
「これが、変数の型の基本のもの全てだ」
全てズラーっと書いて見せると、二人とも唖然としていた。
「こんなにあるの……?」
「覚えるの、大変……」
俺は慌てて首を振った。
「別に全部覚えなくていいぞ。今は、この3つだけ覚えておいてくれ」
そう言って、○のついているint, double, Stringに指をさした。
本当はbooleanにも○をつけようか迷ったが、いま真偽値について説明しても、おそらくピンと来ないからな。使うときになったら説明しよう。
エルもステラも、安心したように息をついた。そして、エルがこう尋ねた。
「intとdoubleとStringだけでいいのね……他のは使わないの?」
「booleanも使うが、今は使わないから説明しない。他のも……自分から使うことはほとんど無いな」
「……使わないなら、じゃあなんで存在するのよ」
「昔使ってた名残みたいなもんだ」
エルが、さらにこう尋ねた。
「小さな数とか大きな数って、どれくらいなの?」
どれくらいだっけ……思い出しながら答える。
「byteは-127~+128、shortはマイナス3万~プラス3万くらい、intはマイナス何十億~プラス何十億だ。
longは……大きすぎて忘れたが……兆の上の単位だったはずだ」
「……何十億とか、兆の上とか、絶対使わないわよ……」
「まあ、普通に使っている限りは超えたことがないな……。ちなみにfloatとdoubleは……ものすごく小さな数から、longよりも大きな数まで表現できる」
「……へぇ……もうそこまでいくと、どうでもいいわね……」
floatとdoubleの表せる桁については、詳しい説明は面倒なのでやめておこう。浮動小数点の話をする必要があるけど、それだけで一時間くらい消費するし。
「文字列……って……?」
ステラが、Stringに指をさして尋ねた。
「単語とか文章のことだな。ダブルクォーテーション("")で囲う必要があって……って、実際にそれぞれ使っているのを見た方が早いな」
説明を切り上げて、魔石にコードを書いた。
public class Test {
public static void main(String[] args) {
int i = 123;
System.out.println(i);
double d = 123.456;
System.out.println(d);
String s = "hello!";
System.out.println(s);
}
}
順番に変数を設定して、printlnで表示していくプログラムだ。ちなみに、変数を宣言するのは、変数を使用する前であればいつでも良い。最初の3行で3つとも宣言してもいいし、使う直前に宣言してもいい。使う直前に宣言したほうがコードを読みやすくなるので、そちらの方が好ましいだろうが。
コードを書き終えてから「テスト」と唱えて魔法を実行した。すると、
[
123
123.456
hello!
]
と表示された。
「Stringって……数字じゃないのに……変数……?」
「そうだな。魔法の世界では、文字も数字の一種なんだ」
魔法の世界では実際どうかは知らないが、プログラミング……というか機械の世界では、文字は数字だ。機械が文字を表示するときは、数字の羅列を文字コードという解読表を使って文字に変換して、文字として表示しているのだ。
「それで、変数は本って例えたけど……intとかって別に1ページの1行しかない本になるけど、Stringは本の内容が入るくらい平気で記憶できちゃうんだ」
「……そんなに……? ……すごい……」
使っている機械がどれくらいメモリを使えるかで左右されるが、基本的に1億文字くらいは記憶できる。夏目漱石の『こころ』が500冊ぶんだ。……この世界ではそこまで記憶できるかどうかは知らないが。
しばらくした後、ステラが、はっ、と何かに気付いた。
「Stringだけ……大文字……なんで……?」
まだ説明のしにくい部分だ……が、これに関しては後々重要になってくるので、本当のことをかいつまんで説明することにした。
「本当は、こいつだけちょっと仲間外れなんだ。String以外は"基本型"って言って、特別なんだよ」
「……Stringが、特別じゃなくて……?」
「ああ。基本型は、ここに書いたString以外の8つしかない。けど、Stringみたいな普通の型は、他にもっといっぱいあるんだ」
「……文字以外も、変数の種類、あるの……?」
「例えば、ファイアボールの魔法を見てみると……」
import ...
public class FireBall {
private static final int USE_MP = 3;
public static void main(String[] args) {
Target self = new Target(Mana.Self);
Fire fire = new Fire(Mana.getMagicForce(self, USE_MP));
Magic m = new Molder(Molder.SMALL_ROUND).mold(fire);
m.releaseForward(self);
}
}
「Targetとか、Fireとか、Magicとか、こういうのが普通の型だな。普通の型は単純な数字とか文字は入れられないけど、例えばFireだと、扱う炎の強さとかを表せるんだ。これを説明するのはだいぶ後になるけど、その頃には多分この魔法も読めるようになるぞ」
「…………分かった。楽しみにしてる」
「楽しみ、か……ステラは本当に偉いな~」
そう言いながら、俺はステラの頭をわしゃわしゃと撫でた。実際、ここまで小さい子がついてこれているのは凄い。
「……ハル。私のこと、子ども扱いしてない……?」
ステラは、ムッとしながら、そう言った。子供扱いされるのが苦手なのだろうか。
「ああ、子供扱いしてごめんな。年齢、10歳くらいだよね。もう立派な歳だもんなー」
「…………私……14歳だよ……」
「……え? 14歳……?」
14歳……今の俺やエルと、1歳しか違わないのか……?
小学生くらいの身長しかないが……異世界だからか? いや、でも俺もエルも身長が特段低いわけじゃないだろうし……ひょっとしてエルフとか……
「ステラは他の子よりもかなり小さいけど、本当に14歳よ? もちろんエルフでもなく、人間よ?」
「……………………え?」
「……また…………子供扱い…………された…………」
このあと、ステラは10分くらい拗ねていた。
各キャラの大雑把な身長は、ハルは175cm、エルは160cm、ステラは140cmくらいの設定です。
今回のまとめ(物語中より細かいところを中心に)
・型の種類
正確な値の範囲は、以下の通りです。
byte 1バイト(-128~127)の整数
short 2バイト(-32768~32767)の整数
○int 4バイト(-21億~21億くらい)の整数
long 8バイト(-922京~922京くらい)の整数
float 4バイトの浮動小数点数
○double 8バイトの浮動小数点数
char 1文字(Unicode文字)
○String 文字列
boolean 真偽(true, false)
String以外は基本型(プリミティブ型)といい、型名を変数名に使えない等、他の型と明確に区別されます。
(基本型でない型は変数名に使えるので、例えば『String string = "abc"』や『String String = "abc"』と書いてもエラーになりませんし、前者のような書き方は一般的に使われています)
・値
int等の整数を扱う型には、整数(例:123, -456)が入ります。
物語中では使いませんが、8進数で表現するときは先頭に0を入れ(例:077)、16進数で表現するときには先頭に0xを入れます。(例:0xff)
double等の小数を扱う型には、小数(例:123.456)が入りますが、もちろん整数も入れることができます。
内部で2進数の浮動小数点数として扱っている関係上、誤差が発生しやすく、正確な値の計算には使いません。
charはUnicode文字が入ります。入力の際は'a'のようにシングルクォーテーションを使います。
(""は使えません。逆にStringで''は使えません)
数値を入れることも可能で、println等で出力した場合は数値に対応する文字が出力されます。
Stringは文字列が入ります。
""と入力すれば0文字の文字列を入力することもできます。(空文字と呼ばれます)
文字数制限は考えなくていいです。(Javaの仕様上10億文字くらいだけど、実際はメモリの関係で1億文字くらい)
booleanには数字や文字でなく、true, falseという二種類の値だけが入ります。(例:boolean b = true)
条件判定などで用いるため重要になりますが、第二章以降で改めて説明します。
n進数や浮動小数点数などの単語については、おそらく物語中では触れませんし、説明するとかなり長くなってしまいますので、ここでは割愛します。情報技術の基礎にあたる話ですので、興味があれば調べてみてください。