第19回 – class 2 – インスタンス化


前回、跳ね返るボールを作る場合に、classを使って作る場合と使わない場合の例を挙げました。
まずclassとは何かというところから説明していきます。

classの利点

classは、オブジェクト指向のために作られた概念で、処理や値(振る舞いやデータ)を1つのオブジェクトとして扱うことによって、機能を切り分け、プログラミングしやすい・考えやすい状態にする事ができます。
前回の例だと、

    x += addX;
    y += addY;
    if (x > width | x < 0) {
      addX *= -1;
    }
    if (y > height | y < 0) {
      addY *= -1;
    }

という一連の処理にmove()という名前をつけてあげることによって、そのclassを使う場合には「moveの中で何をしているか」、というのを考えなくても、「とにかくmoveという命令を実行すればballが動く」、という状態を作り出す事が出来ました。

classを使わない例だと、プログラミングしている間中、「ellipse()で描かれる円の位置を指定しているのはどの変数で、何をそれに足してあげれば思ったような挙動をするのか」というのを常に考える必要がありましたし、もし「この円が壁にあたったら色が変わる」という挙動を追加しようとするとプログラム全体を見なおす必要がありましたが、classを使った例だとclassの中だけを見なおせば良いので、変更や機能追加が簡単に行なえます。
さらに、classを作ってみるとわかりますが、ビジュアル系プログラミング言語とオブジェクト指向はとても相性が良く、プログラムを考えるのが簡単になります。

さて、利点の抽象的な説明はここまでにして、実際にclassを作ってみましょう。

classを作る

class Sample{

}

もっとも小さいクラスは、なんとこれで完成です。
Sampleという名前を持っています。
Processingでは、クラスの名前は必ず大文字で始める、というルール(というか習慣)があります。
これは、後からその名前がclassの名前なのかメソッドの名前なのかを見分けやすくすると言う目的があるので、出来る限り守りましょう。

「最も小さいクラスは」などと言っていますが、お察しの通り全く意味のないクラスです。
意味のないクラスですが、ちゃんとインスタンス化することが出来ます。

インスタンス化というのは、このclassという設計図を元に、新しい実体を作成することを言います。

インスタンス化というのは、このclassという設計図を元に、新しい実体を作成することを言います。

大切なので太字で2回書きました。
そうです、classというのは設計図に過ぎません。
インスタンス化してあげないと使うことは出来ないのです。(そうでもないstaticメソッドや変数などもありますが、またのちほど説明します。今は忘れてください。)

ではどうやったらインスタンス化出来るかと言うと、 new というキーワードを使います。
processingの場合、最初のうちは setup(){ }の中か、draw(){ }の中でインスタンス化することになります。
慣れてくると他のclassの中でインスタンス化したりする機会も増えるかと思いますが、とりあえず例としてSample classをインスタンス化する例を書きます。

Sample sample; //Sample型の変数を宣言

void setup(){
  size(800,800);
  
  sample = new Sample();//インスタンス化
  
}

void draw(){
  
  
}

class Sample{
   
}

まず、一番上の行でSample型のsampleという名前の変数を宣言しています。変数の名前は何でも構いません。
Sample popopo;
とかでもOKです。

classで定義した名前はintなどと同じように変数型として扱います。
Sampleという classのインスタンスが入るのは、Sampleという型の変数のみ、というわけです。

setup(){ }の中で Sample型の変数であるsampleに、

sample = new Sample();

という感じでインスタンス化したものを代入しています。
この時点で、sampleという変数の中にはSampleクラスのインスタンスが入っています。

しかし、このSampleクラスには何の機能もないので、インスタンス化しても使いみちがありません。
次回、このSampleクラスに機能を追加して、ちゃんと実用性のあるクラスにしていきましょう。