クラスとは
クラスを直訳すると、
部類、種類、学級、組、などの意味を持つ英単語
オブジェクト指向言語の参考書では、「クラスとは設計図のこと」 のように表現することが多いが。何となくピンとこない人が多いと感じている。
クラスは、とあるモノの "種類" の、「情報の項目」(フィールド)と、「動作」(メソッド) を定義しているもので、あくまで実態を持たないモノと考えておくと良い。
プログラミングした時に、一番混しやすいと感じているのが、最初に出てきそうなサンプルで、
public class Cat{
private String name;
Cat() {
}
Cat(String name) {
This.name = name
}
void nyaaa() {
if (name == null) {
System.out.print("にゃー");
} else {
System.out.print(name + "だにゃー");
}
}
}
class sample {
public static void main() {
Cat cat = new Cat("モイ");
cat.nyaa();
}
}
上記ソースコードのように、Catクラスを使って、catオブジェクトを生成(インスタンス化)することが多く、猫を猫として利用するのでクラスの存在意義が分からなくなっている。
「クラスは設計図のこと」はその通りで、上記のソースコードだと、Catクラスは、猫という "種類" を定義しているので、猫が持つべき 「情報の項目」と「動作」 が定義されている。
情報の項目 → name:名前
private String name;
動作 → nyaa:鳴く
void nyaaa() {}
猫という種類のモノは、「名前」という情報の項目と、「鳴く」という動作 を持っていると考える。
そのクラスを利用する時には、オブジェクト指向の考え方の根本にある 「現実世界を表現する」 に基づいて、一匹一匹の猫をソースコード上に登場させないといけないので、
Cat cat = new Cat("モイ");
の new演算子 が存在する。
ちなみに、ウチの猫たちの名前は、
- ミケトラの「モイ」
- ハチワレの「マレ」
- 白猫の「ムー」
なので、ソースコード上に登場させてみると、
Cat moi = new Cat("モイ");
Cat mare = new Cat("マレ");
Cat muu = new Cat("ムー");
となる。
最初のsampleクラスでは、猫(Catクラス)を、猫(catオブジェクト)として登場させていたので混乱を招いてしまう。
実際のプログラミングでは、現実で世界を表現するために、複数の猫(上の例だと、モイ・マレ・ムー)をそれぞれ1つずつの個体としてプログラム上に登場させる必要がある。
それぞれの個体は別であっても、猫という種類の設計図(クラス)は同じなので、取り扱い方法は統一されることとになる。
インスタンスとは
インスタンスを直訳すると、
インスタンスとは、事実、事例、例、場合などの意味を持つ英単語
ソフトウェアの世界では 実態 として表現されることが多い。
1つの個体としてプログラム上に登場 したもののことをインスタンスという。
インスタンスを作ることを、インスタンス化と言い、
ソースコードで言うところの new演算子 でそれを実装できる。(プログラマはインスタンス化のことを「newする」ということが多い。)
Cat cat = new Cat("モイ");
ちなみにnew演算子が実行されると、素となるクラス(設計図の方では、 コンストラクタ という動作が行われインスタンスの初期状態を作り上げてくれる。
// {}の中に何も書かれていないので特に何もしていない。
Cat() {
}
// 名前を付けてもらえたら名前を覚えておく。
Cat(String name) {
This.name = name
}
}
とあるサイトでのアカウント作成(サインアップ)で例に出すと、
のように、
- Aさんのアカウント情報を登録 (New しているイメージ)
- Aさんのアカウントでログイン (コンストラクタが実行されているイメージ)
- Aさん用の画面を表示 (個体としてプログラム上に登場したイメージ)
がインスタンスが生成されるまでの流れになる。
(若干、異なる様な気がしてきたが、、)
前の回はこちら → オブジェクト指向の考え方(その3:カプセル化)