■オブジェクト■
オブジェクトとは
これまでの,if文やfor文などと関数だけで書くプログラムを手続き型プログラミングと呼ぶ.これはC言語での記述とほとんど同じ考え方である.
C言語でも十分大規模なプログラムを記述できるが,より便利にプログラミングができるようにオブジェクト指向プログラミングが考え出された.ここでは,その基本となるオブジェクトについて説明する.
例えば自動車のシミュレーションプログラムを作成する場合,自動車に関連する情報や操作には次のようなものが考えられる.
自動車クラス { 車種 属性 ガソリン 属性 速度 属性 ドライバ 属性 前進する 操作 止まる 操作 給油する 操作 }
プログラム上では,自動車に関係するものを全てこの自動車クラスにまとめてしまえば,プログラムがすごくわかりやすくなる.これをカプセル化と呼ぶ.クラスは,オブジェクトの雛型に相当する.この雛型から実際のオブジェクトが生成されることになる.
public class Automobile { int type; //車種 int gas; //ガソリン int speed; //速度 Driver man; //ドライバ public Automobile(int t, Driver d) //コンストラクタ1 { type = t; //車種は,tで指定されたものを登録 gas = 0; //最初ガソリンは0 speed = 0; //最初速度は0 man = d; //ドライバは,dで指定された人 } public Automobile(Driver d) //コンストラクタ2 { type = 0; //車種は,デフォルトで0 gas = 0; //最初ガソリンは0 speed = 0; //最初速度は0 man = d; //ドライバは,dで指定された人 } public void goForward(int v) //前進する { speed = v; //速度をvに変更 } public void stop(void) //止まる { speed = 0; //速度を0に } public int putGas(int liter) //給油する { gas += liter; //ガソリンをliterリットル補給 return gas; //残り何リットルになったか返す. } }
このようなクラスは,実はこれまで使用してきたmain関数を含むクラスと関係している.ただしmainを含むクラスでは,static宣言を使用していたが,ここではstaticを使用していない点に注意して欲しい.staticについては別途説明する.
このクラスの中で,自動車の属性値に相当するような,関数の外側で宣言されている変数のことをメンバ変数と呼ぶ.また,自動車に対する操作に相当するような,クラス内の関数のことをメソッドと呼ぶ.
このクラスは,プログラム内において自動車そのものの定義である.この定義にしたがって,実際には一台一台の自動車が個別に存在することになる.例えば剛さん所有の自動車をマッハ号,マイケルさん所有の自動車をナイト2000とする.
Automobile machGo = new Automobile(レースカー,"三船剛"); Automobile night2000 = new Automobile(コルベット,"マイケル"); Automobile mycar = new Automobile("自分");
このmachGoやnight2000が,Automobileクラスから生み出された実際の「車」に相当する.この一台一台の車のことをオブジェクトまたはインスタンスと呼ぶ.
この関係は基本型の変数と同じともいえる.
型名 | 変数名 |
int | abc |
Automobile | machGo |
クラス名 | オブジェクト名 |
クラスの宣言
これまでmainを含むクラスを作成してきたが,それと同じ形で自分のクラスを宣言することができる.例えば先ほどの自動車クラスは,次の外枠をもっている.クラス名の最初は大文字であることが推奨されている.
public class Automibile { }
publicは,「公開する」の意味で,詳細説明は次回行う.Javaではこのようなpublic classは必ず独立したファイルに記述しなければならない.Eclipseでは「クラスの新規作成」を行ってmainとは別ファイルを用意する.その際,新規クラス名をAutomobileとするなら,ファイル名は必ず「Automobile.java」でなければならない.また,Automobileクラス内にmain関数は作成しない.
クラスの中身は先ほどのようにメンバ変数と,メソッドが必要である.
コンストラクタ
コンストラクタは,メソッドの一種で,このクラスから生成されるオブジェクトを初期化するための専用メソッドである.コンストラクタの名前はクラス名と同じものである.これはオブジェクトが生成される瞬間(後で説明する)に指定された引数とともに自動的に呼び出される.このため引数はあるが,返値は存在しない.コンストラクタは,引数の数や型の種類別に複数用意することもできる.
アクセスメソッド
この例では,pubGasなどのメソッドが用意されているが,よくあるメソッドとしてメンバ変数の値を読み出したり書き込んだりするだけのメソッドがある.これを特別にアクセスメソッドと呼ぶ.通常次のように名前をつけることがお約束となっている.
getメンバ変数名 メンバ変数の値を返す setメンバ変数名 メンバ変数の値を設定する
オブジェクトの生成と,メソッドの呼出
このように宣言されたクラスを用いて,プログラム中でオブジェクトを生成して使用することになる.つまりmainの中で,次のようにオブジェクトを生成し,利用する.
public static void main(String[] args) { Automobile machGo = new Automobile(レースカー,"三船剛"); Automobile mycar = new Automobile("自分"); machGo.putGas(40); //ガソリン40l給油 mycar.putGas(50);
オブジェクトの生成は配列と同様にnew演算子を用いる.ただし,配列と異なり(レースカー,"三船剛")のように括弧の中に初期化に必要なコンストラクタの引数を書き込む.どんな引数が必要かは,コンストラクタの定義を見ればよい.コンストラクタは引数の個数や種類が異なる複数個のものが存在する可能性がある.例えばこのAutomobileでは,車種を含むか含まないかの2種類が用意されており,どちらを利用しても初期化できる.
生成されたオブジェクトのメソッドは,アクセス演算子「.」を用いて呼び出すことができる.原則としてメソッドだけがオブジェクトの中身を操作することができる.