2009年12月31日木曜日

Processing | クラス その1

クラスについて学び、整理してみました。
プログラムの本を読んでいると順を追って長々書いているので 、冒頭のほうを忘れます。
それも必要ですが、復習用には不向きです。
そこでクラスについて1つのサンプルでメモしておくならどうすればいいのか考え、
もちろんまだ学んでいない概念もあってけっこう奥が深いので、基本事項でできるだけ簡単な例で、基本を抑えられるようなサンプルを作ってみました。

  1. class Pt3{
  2.   double x;
  3.   double y;
  4.   double z;
  5.   //コンストラクタ名はクラス名と同じ。
  6.   //x,y,zのそれぞれに代入する場合。もっとも基本とするコンストラクタ。
  7.   Pt3(double cx,double cy,double cz){
  8.     x = cx;
  9.     y = cy;
  10.     z = cz;
  11.   }
  12.   //ひとつのみ指定している場合はx,y,zにすべて同じ値を代入。オーバーロードのコンストラクタ
  13.   Pt3(double cv){
  14.     x = cv;
  15.     y = cv;
  16.     z = cv;
  17.   }
  18.   //引数をまったく指定しない場合はx,y,zにそれぞれデフォルトで1.0を代入。
  19.   Pt3(){
  20.     x = 1.0;
  21.     y = 1.0;
  22.     z = 1.0;
  23.   }
  24.  
  25.   //メソッド
  26.   void out(){
  27.     println("p3d.x = " + x);
  28.     println("p3d.y = " + y);
  29.     println("p3d.z = " + z);
  30.   }
  31. }
  32. void setup(){
  33.   //コンストラクタ:pt3(double cx,double cy,double cz){}を使用している例
  34.   Pt3 p3d1 = new Pt3(1.1,2.3,4.5);
  35.   println("p3d1.x = " + p3d1.x);
  36.   println("p3d1.y = " + p3d1.y);
  37.   println("p3d1.z = " + p3d1.z);
  38.   //コンストラクタ:pt3(double cv){}を使用している例
  39.   Pt3 p3d2 = new Pt3(-1.1);
  40.   println("p3d2.x = " + p3d2.x);
  41.   println("p3d2.y = " + p3d2.y);
  42.   println("p3d2.z = " + p3d2.z);
  43.   //コンストラクタ:pt3(){}を使用している例
  44.   Pt3 p3d3 = new Pt3();
  45.   println("p3d3.x = " + p3d3.x);
  46.   println("p3d3.y = " + p3d3.y);
  47.   println("p3d3.z = " + p3d3.z);
  48.   //コンストラクタ:pt3(double cx,double cy,double cz){}とメソッド:out()を使用している例
  49.   Pt3 p3d4 = new Pt3(10,20,30);
  50.   p3d4.out();
  51. }
  52. void draw(){
  53.  
  54. }

【出力結果】
  1. p3d1.x = 1.100000023841858
  2. p3d1.y = 2.299999952316284
  3. p3d1.z = 4.5
  4. p3d2.x = -1.100000023841858
  5. p3d2.y = -1.100000023841858
  6. p3d2.z = -1.100000023841858
  7. p3d3.x = 1.0
  8. p3d3.y = 1.0
  9. p3d3.z = 1.0
  10. p3d.x = 10.0
  11. p3d.y = 20.0
  12. p3d.z = 30.0
まずはxやyといったメンバ変数です。
これと、コンストラクタのc_xとc_yは異なるものです。
それをx=x;などと書いてあるサンプルもあって意味がわかりませんでしたが、左辺と右辺は違うんです、 xとc_x、yとc_y、といった具合に仮引数の対応表みたいのを作ってやるのがコンストラクタなんですね。それで、省略した書き方も提供することでより簡潔にクラスを使えるようにしようというのがコンストラクタのようです。

コンストラクタは、たとえば一番最初のやつしか書いてなかったら同じことを2回書いてるようにしか思えないし無駄としか思えなかったんですが、こうして異なるコンストラクタを並べ、それを使い、またはメソッドも使いして出力してやればどういうことかがわかりました。というか、異なるコンストラクタを並べて、使って見せてくれなければこの概念はわからないんではないかと思いますよ。
なお、Javaではコンストラクタを書かない場合は、自動的に引数の無い規定のコンストラクタが作られるらしい。

で、メソッドで使用する変数は仮引数、それからメンバ変数のほうです! コンストラクタのじゃないんだね。
また、メンバ変数にm_xなどとするとメンバだというのは見分けやすいんですが、オブジェクトとして使うときにpt3.m_xなどとしなければならなくなるので、それだったらxにしておいてpt3.xと書いたほうが読んで意味がわかりやすいですよね。たぶんそうしたほうがいいんだと思う。

あぁ、それにしてもプログラミングの本てどうしてどれもあんなに大きくて重いんでしょうね。
文庫本サイズで薄い本もあればいいのに・・・。

【各ポイント】
◆クラス
クラスのメンバには変数、コンストラクタ、メソッドの3種類がある。
・クラス名の先頭は大文字(?)
・メンバ変数はm_xなどとしないほうがいい(?)
なぜなら、メソッド以外でアクセスするときもm_xとしなければならなくなる。
objetc.xのほうが直感的でいいはずだ。


◆コンストラクタ
・クラスメンバの一種。
・名前はクラス名と同じでなければならない。
・特定のクラスのオブジェクトを作成、初期化する特殊なメソッド。
・引数を受け取ることができる。
・戻り値を返すことはできない。(作成したオブジェクトへの参照を返す)
・オーバーロード機能により、複数のコンストラクタを定義可能。たとえば引数の一部を省略した呼び出しの場合、省略された引数へはデフォルト値が入るようなコンストラクタなど。

制作・©:のぼる/N.Lab