[Processing] 変数-基本型と参照型の基礎

  • SumoMe

Processingではデータを保持する場合、値を直接記憶する「基本型」と、間接記憶する「参照型」の2つが変数として用意されています。この2つについて完全ではありませんが、把握している程度をまとめてみます。

基本型と参照型

Processingでは基本型と参照型が用意されています。この2つの違いは、「値を記憶」するか「記憶した場所を記憶する」の違いです。概要基本型は8つ用意されており、それら以外は参照型です。基本型を組み合わせた複雑なデータは参照型になります。

基本型

値を変数に直接記憶することができることが出来るのが、基本型です。基本型には以下の8つがあり、それぞれ効果が違い、データ量も異なります。

詳細 情報量
boolean 真偽(true, false)
byte 1byte(=8bit)
char 一文字 2byte(=16bit)
color 色情報 4byte(=32bit)
double 倍精度浮動小数点型 8byte(=64bit)
float 浮動小数点型(3.40282347E+38 〜 -3.40282347E+38) 4byte(=32bit)
int 整数型(2,147,483,647 〜 -2,147,483,648) 4byte(=32bit)
long 倍精度整数型(-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807) 8byte(=64bit)

以下は変数宣言と、初期化のいくつかの例です。

boolean b = true; // boolean型で変数bを宣言、trueで初期化
byte bt ; // byte型で変数bt宣言
char ch = 'あ'; // char型で変数ch宣言、文字'あ'で初期化
int i; // int型で変数iを宣言
float f = 10.3; // float型で変数fを宣言、10.3で初期化
color c = #FF0000; // color型で16bitの色指定(#赤赤緑緑青青) 通常の色指定なら 0xアア赤赤緑緑青青

参照型

参照型は変数に直接値を記憶するのではなく、どこかに値を記憶させておいて、その記憶した”どこか”の位置を記憶するというものです。利用する場合は、記憶した位置から値を参照します。この時、特に意識することなく参照することができます。以下に参照型の例を示します

// A
int [] a = new int[3];
// B
int [] b = a;
// C
print("a:"+join(nf(a,0),',')+"\n"); // aの中身を表示
print("b:"+join(nf(b,0),',')+"\n"); // bの中身を表示

// D
b[0] = 10; b[1] = 2; b[2] = 130;
// E
print("a:"+join(nf(a,0),',')+"\n"); // aの中身を表示
print("b:"+join(nf(b,0),',')+"\n"); // bの中身を表示

// F
a = null;
b = null;

今回はArray(配列)クラスを生成(new)して利用する例を取り上げます。それぞれのコメント部分の処理は以下のような挙動をしています。

  • 長さ3の整数型配列を”どこか”に生成し、変数aへリンクする
  • 変数aに保存した”どこか”へのリンクを変数bにコピーする
  • 変数aと変数bにリンクされた内容を表示
  • 変数bにリンクした”どこか”の配列の内容を変更
  • 変数aと変数bにリンクされた内容を表示
  • 変数aと変数bにリンクを無効化

コメントA部

コメントA部分ではint型の配列を3つ生成しています。この時、実際のデータは”どこか”に生成されており、その位置を変数aは記憶しています。リンクしている状態ですね。配列は生成時に0が記憶されています。イメージにすると以下のようになります

int [] a = new int[3];

参照A

コメントB部

コメントB部分では、変数bに対して生成ではなく、変数aのリンクをコピーしています。つまりコメントA部分で生成された配列は両変数から参照されている状態になります。

int [] b = a;

参照B

コメントC部

コメントC部分では変数aと変数bがリンクしている配列を参照し、値を表示します。同じ配列とリンクしているので、両方とも同じ値が出力されているのが確認できます。

print("a:"+join(nf(a,0),',')+"\n"); // aの中身を表示
print("b:"+join(nf(b,0),',')+"\n"); // bの中身を表示

参照C

コメントD部

変数bが参照している配列に対して、値を代入して書き換えています。

b[0] = 10; b[1] = 2; b[2] = 130;

参照D

コメントE部

コメントE部分では変数aと変数bがリンクしている配列を参照し、値を表示します。同じ配列とリンクしているので、両方とも同じ値が出力されているのが確認できます。コメントD部で変数bが参照している先の配列を変更しているため、同じ配列を参照している、変数a,変数bも変更された値が表示されます。

print("a:"+join(nf(a,0),',')+"\n"); // aの中身を表示
print("b:"+join(nf(b,0),',')+"\n"); // bの中身を表示

参照E

コメントF部

変数に”null”を代入することにより、配列がある”どこか”の情報を上書きして、リンクを消去します。どこにもリンクしていない配列はもう利用されないため、ゴミとして扱われます。システムがタイミングの良い時にゴミを回収し(=ガベージコレクション)、解放しますので、放置しておいて問題ありません

a = null;
b = null;

参照F

このように参照型とは、”どこか”に生成(new)して、そのありかを変数に格納しておき、必要になったら参照して利用します。

メリット

例えば、巨大な配列などの大きな情報をコピーではなく、配列の位置を受け渡しすることで、小さい情報の受け渡しだけで共有することができることです。

デメリット

  • 情報を共有しているため、どちらか片方を編集すると、両方に影響する
  • (リンクのコピーでなく)値をコピーする場合、代入( = )ではなく、自らコピーする方法を用意をする必要がある

おわりに

今回は変数の基本型・参照型のメモを書きました。いたらない部分が多く、特に参照型の扱い方にはまだまだ取り扱うためには知っておかなければならない情報も多いです。ですが、これ以上記事が長くなると読みづらくなってしまうため、とりあえずここで筆を置きます。つづきはまたいずれ。

コメントを残す

メールアドレスが公開されることはありません。