クラス 基礎編第20回


20140218

前回オブジェクトの概念について説明しましたが、今回はより具体的な話をします。オブジェクトは「モノ」だということ、そのオブジェクトには「特徴」と「機能」があるということはわかっていただけたと思います。では、プログラミングではオブジェクトをどう扱っていくのかをこれから説明していきます。

クラスとは

クラス(class)を一言で定義すると、「オブジェクトの設計図」です。クラスにはオブジェクトの特徴と機能が定義されています。

クラスではオブジェクトの特徴をプロパティ(property)、機能をメソッド(method)と呼びます。これらはプログラミング言語によって次のように呼び名が異なる場合があります。

  • 特徴:プロパティ(または属性)、フィールド(Java)、データメンバ(C++)
  • 機能:メソッド、メンバ関数(C++)

この特徴と機能をクラスのメンバと呼びます。呼び名が異なるだけで、特徴はそのオブジェクトが持つデータ、機能はそのオブジェクトに属する関数と考えるとよいかもしれません。クラスを作成(記述)することを「クラスの宣言(declaration)」といいます。

クラスの例

例として、次のような簡単なクラスを記述してみます。

  • クラス名:Person
  • プロパティ:名前、身長、体重
  • メソッド:BMIの計算

これを次のようにコード化します。

見た感じが以前説明した「構造体」に似ています。クラスは、変数~配列~構造体からさらに進化したものと考えることができます。実際、オブジェクトはクラス型の値を格納する変数として扱われます。

クラスの書式

クラスの書式は、プログラム言語によって異なります。上記は、C++での簡易例ですが、本来は次の書式になります。

ここで注意して欲しいのは、C++の場合、メンバ関数は宣言のみを行い実際の処理(本体)は別に記述することが多いということです。上記のpersonクラスではクラスの中にメンバ関数(showBMI)を記述しましたが、メンバ関数が多い複雑なコードになると、次のようにクラスの外側に本体を記述します。

では、Javaの場合を見てみます。

名称など、いくつかの違いがありますが、基本的にほとんど同じような書式です。

アクセス修飾子(access modifier)という用語が出てきました。これは、それが付けられたメンバへのアクセスを制御するものです。これについては回を改めて説明します。

クラスからインスタンスへ

家の設計図があっても、その設計図に住むことはできません。住むためには設計図に従って家を建てる必要があります。クラスも同じです。personというクラスは作成しましたが、そのままでは使用できません。そのクラスを使ってオブジェクトを作る必要があります。

クラスから作成されたオブジェクトをインスタンス(instance:実体)、クラスからオブジェクトを作成することをインスタンス化(実体化)するといいます。クラスをインスタンス化するとは、そのインスタンスをメモリ上に確保することです。次のようにインスタンスを作成します。

C++の場合:

クラス名 インスタンス名;

前述のpersonを使うと、

となります。

Javaの場合:

1つの文で書くこともできます。

前述のpersonクラスがJavaで有効なクラスだとして、

または

さらに、別のインスタンスを作成することができます。

このようにして作成されたインスタンス(オブジェクト)のメンバにアクセスします。やり方は構造体のときと同じです。

インスタンス名.メンバ

インスタンス名とメンバは「.」(ドット演算子)で繋げます。

注:Javaでオブジェクトを作成するときは、new演算子を使用しますが、C++でもnew演算子を使用して作成することができます。この場合、ポインタを利用するため説明を省きました。C/C++のポインタはこの講座では扱いません(非常に説明が難しいため)。

まとめ

今回はクラスの概要について説明しました。簡単にまとめると次のようになります。

  • クラスはオブジェクトの設計図
  • オブジェクトはクラス型の値を格納する変数
  • クラスをインスタンス化して使用する
  • 1つのクラスから複数のインスタンス作成できる

なかなか難しいと思いますが、気楽にお付き合いください。

次回は、オブジェクトの3つの概念について説明します。

では、また。

コメントしてみる