元Webデザイナー兼コーダーの備忘録

ウェブデザインやプログラミング、ブログのカスタマイズなどについてアウトプットしています。

 メニュー

» HTML入門のまとめはこちらです。

Processingで学ぶ静的メソッドとインスタンスメソッド

The Nature of Code(PDF版)からPVectorについて取り上げます。PVectorを用いたサンプルプログラムからPVectorの静的メソッドとインスタンスメソッドについて学びます。Processingでプログラムを書いて、動作を確認します。動作を確認できるところがProcessingの楽しいところです。

静的メソッドとインスタンスメソッド

まず、次のコードのようなコードがあります。

float x = 0;
float y = 10;

x = x + y;

println(x);  //10.0と表示される

x+yの結果をxに代入して、その結果を表示しています。このような計算をPVectorで行うと次のようになります。

PVector x = new PVector(0,0);
PVector y = new PVector(3,4);
x.add(y);

println(x);  //[3.0, 4.0, 0.0]と表示される

これは、ベクトルxとyの成分計算です。ベクトルxのx成分にベクトルyのx成分を足します。また、ベクトルxのy成分にベクトルyのy成分を足します。そうするとベクトルxは、x成分が3、y成分が4になります。(x, y) = (3, 4)

次の例を見てみます。

float x = 0;
float y = 10;

float z = x + y;

println(x);  //0.0と表示される
println(y);  //10.0と表示される
println(z);  //10.0と表示される

x+yの結果をzに代入して、その結果を表示しています。他に、xとyの値も表示しています。ここで、xの値が書き換わらないことに注目します。これまでの方法を元にPVectorで上記の計算を考えると以下のようになると思います。

PVector x = new PVector(0,0);
PVector y = new PVector(3,4);
PVector z = x.add(y);

println(x);  //[3.0, 4.0, 0.0]と表示される
println(y);  //[3.0, 4.0, 0.0]と表示される
println(z);  //[3.0, 4.0, 0.0]と表示される

この方法だとxの値が書き換わってしまいます

PVector z = x.add(y);  //xの値が上書きされる

今まで使っていたオブジェクト名.add(引数)の書き方だと、元のオブジェクトの変数の値を書き換えてしまいます。ベクトルxの値を書き換えないようにするには、PVectorクラスの静的メソッド(スタティックなadd()メソッド)を使います。PVectorクラスのスタティックなadd()メソッドの中身は、以下のように書かれているそうです。

static PVector add(PVector v1, PVector v2) {
  PVector v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
  return v3;
}

ここでは、PVector型の新たな変数v3を用意し、2つのベクトルを足したものをそれに代入しています。そして、v3オブジェクトを呼び出し元に返しています。この静的メソッドの使い方は、以下のようになります。

PVector x = new PVector(0,0);
PVector y = new PVector(3,4);
//PVector z = x.add(y);  //インスタンスメソッド
PVector z = PVector.add(x,y);  //静的メソッド

println(x);  //[0.0, 0.0, 0.0]と表示される
println(y);  //[3.0, 4.0, 0.0]と表示される
println(z);  //[3.0, 4.0, 0.0]と表示される

これでxの値は書き換わらなくなりました。今回のように変数の値を書き換えられたくない場合は、静的メソッドを使うと良いです。

静的メソッドを呼び出す書き方は、以下です。

クラス名.メソッド名(引数);

ちなみに、PVectorクラスには、add()、sub()、mult()、div()の静的メソッドがあります。

インスタンスメソッド

今まで使っていた以下の記述は、インスタンスメソッドを呼び出す書き方です。

オブジェクト名.メソッド名(引数);

PVectorクラスのインスタンスメソッドの方のadd()メソッドの中身は、以下のように書かれているそうです。

void add(PVector v) {
  x = x + v.x;
  y = y + v.y;
}

これだとメソッドを呼び出しているオブジェクト自身の変数を書き換えることになります。

まとめ

The Nature of Code(PDF版)からPVectorについて取り上げました。PVectorを用いたサンプルプログラムからPVectorの静的メソッドとインスタンスメソッドについて学びました。引き続き、The Nature of Code(PDF版)の内容を勉強します。

参考サイト

» HTML入門のまとめはこちらです。