Section 1.4 変数のデータ型

今回は前回の続き、TJS の変数に代入できるデータ型について。
データ型って、数字とか文字とかそういうの?
そうそう。
TJS の変数はこういうデータ型を扱えるんだ。

<TJS の変数が扱えるデータ型>
void何も表していない(変数の中身が空である)ことを表す
整数型0, 100, -256 などの整数値
実数型0.1, -123.456 などの小数を含む数値
文字列型"abc", "あいうえお" などの文字列
オブジェクト型new 演算子で確保したオブジェクト、関数、クラス、プロパティオブジェクトなど
オクテット列型バイナリデータを扱うための型

なんか初めて見るのが結構あるね。
TJS の変数は色んなデータを扱えるからね。
じゃ、まずは void から。
ヴォイド?
void ってのは、「何も表していない」ってこと。
変数の値が void の場合は「変数の中身に何も入ってないよ」って意味。
変数を箱にたとえると、箱が空っぽの状態ってことだね。
それって 0 ってこと?
ううん。そうじゃないよ。
0 っていうのは箱の中に『0』っていう数字が入ってる状態のことだけど、 void ってのは数字でも文字でもない何にもない状態。
例えば、宣言した後何も代入されてない変数は、何も値を持ってないから void なんだ。
う〜ん、わかったようなわかんないような…
まぁ、今はそんなに深く考えなくても大丈夫。
とりあえず、変数にはそういう状態があるっていう程度に考えといて。
うん、わかった。
次は整数型
これはお馴染みのデータ型だよね。
うん。
0, 1, 2, 3, …っていう数値だよね。
あ、あとマイナスもあるよね。-1, -2, -3, …って感じで。
ん、そう。
ちなみに TJS では -922京3372兆368億5477万5808 から 922京3372兆368億5477万5807 の範囲の数値が使えるんだ。
そ…そんなに!?
うん。だから整数の計算ならほとんどの計算ができるんじゃないかな。
そりゃこれだけ範囲が広かったらどんな計算でもできそうだよね…
次は実数型
これは整数型を拡張して小数も扱えるようにした型、って感じかな。
0.01 とか -1.234 みたいに小数点がつく数値が使えるってことだよね?
ん、そうそう。
あと、実数型は 1000000000000000000000000000000.0 とか 0.000000000000000000000000000001 とかいう、 すごく大きい数値や細かい数値も使えるよ。
うわ、最初の数字はもう何て読んでいいかもわかんないね…
まぁ、こんな数値は普通は使わないだろうけどね。一応こんな数値も扱えるよ、ってことで。
じゃ次は文字列型。これも今までにも何回か使ったからわかるよね。
うん。
メッセージボックスに文章を表示する時とかに使う文字のデータだよね。
ん、そう。
文字列型の値は『"』(ダブルクォーテーション)か『'』(シングルクォーテーション)で囲むんだ。
だから…

var string1 = "abc";
var string2 = 'abc';

上のスクリプトの string1string2 の中身は同じになるよ。
なんで2種類あるの?
文字列の中にダブルクォーテーションがある時のためじゃないかな。
例えば、『文字列は"ダブルクォーテーション"で囲んでね。』っていう文字列を変数に代入したいときには…

<これはダメ!>

var message = "文字列は"ダブルクォーテーション"で囲んでね。";

って書くと『文字列は』ってとこまでが囲まれてて、その後ろが文字列の外に出ちゃってるからエラーになっちゃうんだ。
でも…

<これはOK!>

var message = '文字列は"ダブルクォーテーション"で囲んでね。';

って書いた場合は、文字列はシングルクォーテーションに囲まれてるってみなされるからOKってワケ。
あと、逆に

<これもOK!>

var message = "文字列は'シングルクォーテーション'で囲んでね。";

ってのもOK。
なるほどね〜。
あとエスケープ文字を使う方法もあるんだけど、ややこしくなりそうだから説明はパスするね。
じゃ、次はオブジェクト型
オブジェクト型には色々あるんだけど、複雑だから今回は1つだけ紹介しとくね。
うん。
Date クラスのメソッドが使える、あの d っていう変数がオブジェクト型の変数なんだ。
そういえば、さっき d も変数だって言ってたもんね。
うん。
TJS ではこういう複雑なデータも変数として扱うことができて、それをオブジェクト型の変数って呼ぶんだ。
なんか奥が深いね〜。
まぁね。ま、そのうち慣れると思うよ。
で、最後はバイナリデータを扱えるオクテット型なんだけど…
これは滅多に使うことないし、今回の時計を作るのにも使わないから、ここではパスするね。
あ、そうなの?
うん。
詳しく知りたい場合は TJS2 リファレンスの『オクテット列に対する操作』の項目を見てね。
うん、りょーかい。
これでデータ型の説明は一通り終わったから、 次は『何年何月何日何時何分何秒』の形式で今の時間を表示するスクリプトを書いていこ。
あ、そういえばそれが目標だったよね。
ここまで長かったから忘れちゃってた…
それじゃ、変数に年、月、日、時、分、秒を代入するスクリプトを書いてみて。
え、わたしが書くの!?
うん。代入するところまでなら、今回の内容が解ってればできるから。
とりあえずやってみて。
わかった。やってみる!
え〜っと、年の値を変数に代入するところまでは前回やったから…

var d = new Date();
var year;            // 変数を宣言します
year = d.getYear();  // 年の値を year に代入します

ここまではこれでいいんだよね?
ん、OKだよ。
あ、こういう場合は…

var d = new Date();
var year = d.getYear();  // 初期値として年の値を year に代入します

こうすると year が年の値で初期化されるから、 結果的には宣言してから代入するのと同じになるんだ。
あ、そういえば d の方はそうやって宣言してるもんね。
じゃあ、この後はこのやり方で書いてくね。
ん。
えっと、次は月だから…変数名は month にして…

var d = new Date();
var year = d.getYear();    // 初期値として年の値を year に代入します
var month = d.getMonth();  // 初期値として月の値を month に代入します

こうだよね。
これじゃダメだよ。
えっ、なんで!?
ほら、前に言ったじゃない。
getMonth は実際の月より1小さい値になるから…
あ、そっか!
1足さなくちゃいけないんだ!
ん、そういうこと。
ってことは…

var d = new Date();
var year = d.getYear();        // 初期値として年の値を year に代入します
var month = d.getMonth() + 1;  // 初期値として月の値を month に代入します

これでいいのかな?
ん、これでOK。
あとはそのままでよかったハズだから…

var d = new Date();
var year = d.getYear();        // 初期値として年の値を year に代入します
var month = d.getMonth() + 1;  // 初期値として月の値を month に代入します
var day = d.getDate();         // 初期値として日の値を day に代入します
var hour = d.getHours();       // 初期値として時の値を hour に代入します
var minute = d.getMinutes();   // 初期値として分の値を minute に代入します
var second = d.getSeconds();   // 初期値として秒の値を second に代入します

これでどう?
うん、完璧!
やった、ちゃんと書けた〜!
じゃ、後はこの変数を使って『何年何月何日何時何分何秒』の形式で表示するよ。
それってどうやるの?
『文字列の足し算』をやるんだ。
えっ、文字列って足し算できるの?
うん、数字の足し算と同じように『+』を使って足し算できるよ。
まぁ、足し算って言うより連結って感じだけどね。
試しにこのスクリプト実行してみて。
うん。

<文字列の足し算>

var ichi = "1";
var gatsu = "月";
var ichigatsu = ichi + gatsu;
System.inform(ichigatsu);

あっ、ほんとだ!
1』と『』がつながって『1月』って表示された!
これを使って『何年何月何日何時何分何秒』っていう文字列が作れるんだ。
例えば『何年』っていうのはこんな感じ。

<年を表示するスクリプト>

var d = new Date();
var year = d.getYear();        // 初期値として年の値を year に代入
var message = year + "年";     // 年の値と"年"を連結
System.inform(message);

うん、ちゃんと『2007年』って表示されたよ!
じゃ、ここで一つ質問。
な、なに…?
year っていう変数のデータ型は何だと思う?
え? えっと… getYear メソッドが教えてくれる年の値を year に代入してるんだから、 year2007 だよね。
ってことは…整数型?
ん、正解。
よかった、合ってた。
でも、year が整数型だと、3行目の足し算ってちょっとヘンだと思わない?
えっ? 別に普通の足し算じゃ……
あっ! "年" は文字列だから、数字と文字列を足し算してるの!?
そう、それ。
確かにヘンだよね……
でもちゃんと『2007年』って表示されてるし……どうなってるの?
実は、足し算する値に数値と文字列が両方入ってる場合は、数値が自動的に文字列に変換されるんだ。
つまり…

var message = "2007" + "年";

っていう足し算をやってるのと同じことになるんだ。
だから message には "2007" っていう文字列と "年" っていう文字列が連結された "2007年" っていう文字列が代入されるってワケ。
へぇ、そうなんだ。
TJS の足し算では、こんなふうにデータ型が違ってても、自動的にデータ型をうまく変換してくれるから、 データ型をそれほど気にしなくてもちゃんと計算できるようになってるんだ。
便利なんだねぇ。
うん。
じゃ、続きやってみて。
おっけー!
あ、その前にちょっと聞きたいんだけど…こんなふうに続けて書いても大丈夫?

var message = year + "年" + month + "月";

ん、だいじょぶだよ。
この場合もちゃんと yearmonth が両方とも文字列に変換されるから。
それなら…

var d = new Date();
var year = d.getYear();        // 初期値として年の値を year に代入
var month = d.getMonth() + 1;  // 初期値として月の値を month に代入
var day = d.getDate();         // 初期値として日の値を day に代入
var hour = d.getHours();       // 初期値として時の値を hour に代入
var minute = d.getMinutes();   // 初期値として分の値を minute に代入
var second = d.getSeconds();   // 初期値として秒の値を second に代入
var message = year + "年" + month + "月" + day + "日" + hour + "時" + minute + "分" + second + "秒";
System.inform(message);

これでどうかなぁ…?
じゃ、実行してみよっか。
う、うん…
なんか緊張する…

<実行結果>

時刻表示スクリプトの実行結果

わ〜っ、ちゃんと表示されたよ〜!
うん、ばっちりだね!
今回はがんばったもん。
ん、じゃ次回もその調子でね。
うん、次回もがんばるよ〜!


前へ | TOP | 次へ