オブジェクト指向①クラスとメソッド
プロジェクトの準備
Eclipseで新規にプロジェクトを作成しましょう. メニューから[ファイル]-[新規]-[Javaプロジェクト]をクリックして,「新規Javaプロジェクトの作成」を開きます. ここでは,プロジェクト名に”Project7”を入力して,[完了]をクリックしましょう. パッケージ・エクスプローラに作成したプロジェクトが表示されていることを確認してください.
続いてソースファイルを作成しましょう. メニューから[ファイル]-[新規]-[クラス]をクリックして,「新規Javaクラス」を開きます. ここでは,名前に”MyClass”を入力し,public static void main(String[] args)(V)にチェックを入れ,[完了]をクリックしましょう. パッケージ・エクスプローラに作成したソースファイルが表示されていることを確認してください.
オブジェクト指向
今回はJavaの本質とも言えるオブジェクト指向について学びます. オブジェクト指向は,大規模なプログラムを作成する際の開発者の負担を減らすためのコンセプトであり, オブジェクト指向に沿ってプログラミングすることでプログラムの「柔軟性」「保守性」「再利用性」の向上が期待できます. しかし,オブジェクト指向はあくまでコンセプトであり,たとえ経験豊かなエンジニアであっても, 一言で「オブジェクト指向が何か」を言い表すことは難しく, Javaプログラミング初心者にとっては大きな障壁となりがちです.
極論すれば,オブジェクト指向とは「現実世界の オブジェクト(もの) を, そのままプログラムの世界の オブジェクト(もの) に置き換えること」と言えます. 例えば,サッカー選手をプログラムの世界に置き換えることを考えてみます (ウイニングイレブンなどのサッカーゲームを想像してください). サッカー選手をプログラムの世界で表現するには,サッカー選手の特徴を数値化したり,それぞれの役割や操作を定義する必要があります. 例えばサッカーゲームの本田圭佑選手は,キック力は80,ドリブルスピードは76などのように,個々の特徴を数値で特徴化していますね. 他にも,ポジションはフォワードやミッドフィールダー,操作はドリブルやシュートなどを設定する必要がありそうです.
オブジェクト指向では,オブジェクト(サッカー選手)を表現する型のことをクラス,そして, 型を実体化したもの(本田圭佑選手)をインスタンスと呼びます. また,個々の特徴をフィールド,操作をメソッドと呼びます. 一方,オブジェクトは実は曖昧な表現で,クラスとインスタンスの両方の意味で用いられることがあるので注意が必要です.
クラスの定義
ここでは,現実世界の「色画用紙」をクラスで表現することを考えてみましょう. 画用紙に必要な特徴は何でしょうか. ここでは,幅(width),高さ(height),**色(color)**を色画用紙を表す特徴として考えていきましょう.
クラスはファイルに1つだけ定義するのが基本です. まずは,色画用紙を表すPaperクラスを新規に作成しましょう. メニューから[ファイル]-[新規]-[クラス]をクリックして,「新規Javaクラス」を開きます. ここでは,名前に”Paper”を入力し,[完了]をクリックしましょう.
クラスの宣言部に当たるpublic class クラス名{}
は既に記述されています.
この宣言の{}
内に,画用紙の特徴を表すフィールドを定義します.
ここでは,width,height,colorの3つのフィールドです.
下記のコードを参考に,色画用紙を表すクラスPaperのフィールドを宣言してみましょう.
次に,下記のコードを参考にPaperクラスをインスタンス化してみましょう.
ここでは,幅182[mm],高さ257[mm],赤色の画用紙を想定しています.
インスタンス化はクラス名 変数名 = new クラス名()
と記述します.
また,フィールドに値を代入したり,保存されている値を取り出すには変数名.フィールド名
と記述します.
このコードはMyClassクラスに記述していることに注意してください.
プログラムの実行後にコンソール出力を確認してください.
メソッドの定義
Paperクラスのメソッドを定義してみましょう. ここでは,画用紙の面積を計算するメソッドを考えてみます. メソッドは下記のように記述します. 返値とは,メソッド実行後に,呼び出し元に返す値のことを指します. この場合,返値の型はint,返値は面積となります.
public 返値の型 メソッド名(){
実行する命令
return 返値;
}
下記のコードを参考に,Paperクラスに面積を計算するgetAreaメソッドを定義しましょう.
int型の変数areaに計算した値を一旦代入して,return area;
で呼び出し元に面積を返しています.
ここで,this.width
やthis.height
などの表記は,
変数widthとheightがPaperクラスのフィールドであることを明示するために用いています.
下記のコードを参考に,呼び出し元であるMyClassクラスで,
getAreaメソッドの返値を受け取り,コンソールに出力してみましょう.
メソッドを呼び出すには,変数名.メソッド名()
と記述します.
プログラムの実行後にコンソール出力を確認してください.
メソッドには呼び出し元から引数を渡すことができます. 引数は「呼び出し元」から「呼び出し先」へ渡される変数と理解してください. 1つの引数を渡すメソッドは下記のように記述します. 引数を複数列挙して,一度に複数の値を渡すことも可能です.
public 返値の型 メソッド名(引数の型 引数){
実行する命令
return 返値;
}
下記のコードを参考に,画用紙の大きさを指定倍するexpandメソッドを定義しましょう. int型の変数scaleを引数として,画用紙の幅と高さを拡大しています. ここで,voidは,このメソッドは返値がないことを意味しています(returnもない).
下記のコードを参考に,呼び出し元であるMyClassクラスで, expandメソッドを呼び出し,幅と高さの値をコンソールに出力してみましょう. ここでは,int型の変数scaleに2を代入し,引数としてexpandメソッドに渡しています. プログラムの実行後にコンソール出力を確認してください.
勘の良い人は気づいていると思いますが,MyClassクラスのmainメソッドは特殊なメソッドで, プログラムを実行するときに最初に呼び出されるメソッドです.
コンストラクタ
コンストラクタは特殊なメソッドで,クラスのインスタンス化と同時に呼び出されるという特徴があります.
このため,コンストラクタはフィールドの初期化に利用されます.
下記のコードを参考に,Paperクラスのコンストラクタを定義しましょう.
コンストラクタはクラス名と同一のメソッド名です.
左のthis.width
はフィールド,右のwidth
は引数であることに注意してください.
下記のコードを参考に,呼び出し元であるMyClassクラスで, コンストラクタを利用して,幅(width),高さ(height),色(color)のフィールドを初期化しましょう. プログラムの実行後にコンソール出力を確認してください.
課題
円形の色画用紙を表すRoundPaperクラスを新規に定義してください. また,半径91[mm],青色でRoundPaperクラスをインスタンス化し, 半径,色,面積をコンソールに出力してください. ただし,面積はメソッドを定義して計算してください(円周率はMath.PIを用いること). 課題が完成したら,作成したプロジェクトを実行可能JARファイルの形式でファイルに保存(エクスポート)してください.