2.太郎と次郎
~クラスとオブジェクト~

 さあ、オブジェクト指向プログラミングの入り口です。あまり深読みせず、さらっといきましょう。

人型?

 整数値を扱う場合はint、実数値を扱う場合はdouble、では人のデータを扱う場合は何型を使いましょう?
そう、基本データ型にはないので、自分で定義します。これがクラスです。

 人のデータといっても、氏名から始まって、年齢、性別、住所、電話番号、メールアドレス、所有する車の台数、所有する炊飯器の台数、といろいろなデータの集まりをくくったものになります。また炊飯器の台数は要らないが、所得金額がほしいという場合もあるでしょう。ここでは簡単に氏名と年齢のみにします。

人クラスの定義はこんな感じかな。(感じです、あくまでも)

public class Person {
 String name;  //氏名
 int age; //年齢

 public void jump() {//メソッドjump
  略
 }
    
 public void walk() {//メソッドwalk
  略
 }
}

 基本データ型のintやdoubleはこんな面倒な定義をしなくても使えたのに、とお思いでしょうが、自分で定義できるということは、自由に中身を作れるということなのです。このような型をクラス型といいます。クラス型は参照型のひとつです。なぜ「参照」なのかは、すぐにわかるでしょう。
 人クラスの名前はちょっとプログラムっぽくPersonクラスにしましょう。氏名や年齢といったデータを持っています。

  2+3のプログラムでやったように、基本データ型では+や-で足し算や引き算ができます。Personクラスでも何かできなきゃつまりません。そこでメソッドの登場です。ここではjumpとwalkを指定してみました。略の部分に実際にどういう動作をするかを書いてやります。これでPersonクラスのできあがりぃ。

クラスはオブジェクト製造機

 int型の変数aを使いたいときは

int a;

と宣言しました。ではPersonクラスの変数xを使いたいときは

Person x;

でいいのでしょうか。当たりです。では

a=2;

のように変数xに「5歳の太郎さん」を入れるにはどうしたらいいのでしょうか?こうです。

x = new Person();
x.name="太郎";
x.age=5;

 最初の1行はオブジェクトと呼ばれるものを作っています。下の2行はそこにデータを入れています。イメージはこんな感じです。

int型変数aの場合



Person型変数xの場合



 くどいようですがあくまでイメージです。
 注意してほしいのは、変数aとちがって変数xには、オブジェクトがどこにあるかという情報が入る、ということです。 そして、太郎や5歳などのデータは、オブジェクト本体に入ります。

 ここではオブジェクトが100番地にあるとすると、変数xには100番地が入ります。(あくまでイメージ!) 一々100番地を書くのもみっともないので、この関係を矢印で表すことにします。

このように変数から矢印が出て、メモリのほかの領域を参照しているので、「参照型」というわけです。
参照型には他に、配列型とインターフェース型があります。おいおいやっていきましょう。



 newで作られたxのオブジェクトの氏名や年齢にデータを入れるには、変数名xの後ろにピリオド、そしてクラスの定義で指定した変数名を指定します。

 「100歳の次郎さん」は次のようにして作れます。

Person y;
y = new Person();
y.name="次郎";
y.age=100;

 クラスPersonを使って、太郎さんや次郎さんといったオブジェクトを次々作り出せます。つまりタイトルにもあるように、クラスはオブジェクト製造機なのです。

 出来上がったオブジェクトに芸をやらせましょう。太郎さんにジャンプをやらせます。こんな具合。

x.jump();

もちろん次郎さんだって跳びます跳びます、おっと跳びます。

y.jump();

 上の図では、オブジェクトにメソッドjumpやwalkが入っていませんが、大丈夫ちゃんと別の場所に記憶されていて、x.jump()やy.walk()でそれらが呼び出されます。

 ここでの説明はあくまで、基本データ型に対比して、参照型の中のクラス型のイメージを作ってもらうためのものです。基本データ型はたった8種類しかなかったのに対し、クラス型は、自由に定義できるため無限にその種類は存在します。

 クラス型は参照型の代表選手なのです。



プログラムにしないと気持ちの悪い方へ

 あくまで例え話なのであまりきっちりしたプログラムにしたくはないのですが、無理やりするとこうなりました。

[ファイルPerson.java]
public class Person {
 String name;
 int age;

 public void jump() {
  System.out.println(name + "はジャンプします");
 }

 public void walk() {
  System.out.println(name + "は歩きます");
 }

 public static void main(String[] args) {
  Person x;
  Person y;

  x = new Person();
  y = new Person();

  x.name = "太郎";
  x.age = 5;

  y.name = "次郎";
  y.age = 100;

  x.jump();
  y.jump();

  x.walk();
  y.walk();
 }
}


 単に

太郎はジャンプします
次郎はジャンプします
太郎は歩きます
次郎は歩きます

と出力されます。
このプログラムはPerson.javaに作ります。クラスPersonの中に、このクラスのテスト用のmainメソッドを入れてしまいました。

 もしクラスPersonからmainメソッドをはずすのなら、次のようになります。

[ファイルMain.java]
public class Main {
 public static void main(String[] args) {
  Person x;
  Person y;

  x = new Person();
  y = new Person();

  x.name = "太郎";
  x.age = 5;

  y.name = "次郎";
  y.age = 100;

  x.jump();
  y.jump();

  x.walk();
  y.walk();
 }
}


[ファイルPerson.java]
public class Person {
 String name;
 int age;

 public void jump() {
  System.out.println(name + "はジャンプします");
 }

 public void walk() {
  System.out.println(name + "は歩きます");
 }
}