この章ではクラスについて説明します。
今までのプログラムでは変数と関数を扱ってきましたが、クラスという機能を使うことで多くの変数と関数を1つの機能体として働かせてデータを処理することができます。
クラスとは物を作る設計図に例えられます。
設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
ではクラスについて詳細に説明します。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスという設計図に書いていきます。
「状態」を変数で書き、「ふるまい」をメソッドで書くことになります。
その「状態」や「ふるまい」に指示を出すのはオブジェクトです。
例えば鉛筆の「線を消す」など具体的な指示をオブジェクトという司令塔から出します。
オブジェクトの詳細はこの後に説明します。
ではクラスの基本形から説明します。 〇クラス名は大文字で付けることが慣習になっていますが、自由に付けていただいて結構です。
〇クラスの中に変数やメソッドを書いていきます。
メソッドは関数の別名だと思ってください。 〇この引数はクラスの中で使われるデータです。
〇引数は必要な場合には記述しますが、省略もできます。
ではクラスの例を見てみましょう。 この例のクラスにはBankと言う名前が付いています。
そして、このBankクラスを使うためにはオブジェクトを作成しなくてはいけません。
クラスはただの設計図なので、これを動かすのがオブジェクトです。
それがの箇所です。
オブジェクトを作った後は、そのオブジェクト変数を使って、クラスの中の変数やメソッドにアクセスすることができるようになります。 「クラス名(引数)」という形式で引数が 書かれていますが、この引数はオブジェクトを作成した時に実行するinitメソッドに渡されます。
このinitメソッドの中で設定した変数にオブジェクトで設定したデータを入れます。 initメソッドの構文は次の通りです。 〇 initメソッドの第一引数は引数があっても無くてもselfと書いてください。
selfはオブジェクト自身を意味します。
〇注意点はinitの前後の下線は2つ連続で繋がっています。
この例では下線が1本に見えますがテキストエディタの表記のせいです。
〇 initメソッドはPythonで機能が与えられているメソッドですが、nyuukinメソッドやshukkinメソッドは自分で作成したメソッドです。
ではプログラムの説明をします。
banks=Bank(1200000)のようにオブジェクトを作成すると同時に引数である1200000がinitメソッドの引数であるaにセットされ、self.zandakaに代入されます。
initメソッドやnyuukinメソッドなどのメソッドの中の第一引数には必ずselfを設定します。
また、メソッドの中にクラス内で設定した変数がある場合はその変数にもと言う形式でselfを付けます。
この例ではの箇所です。 「self.zandaka」のようにselfに関連づけられている変数をインスタンス変数と言います。
次はメソッドにデータを入れる方法について説明します。 「オブジェクト.メソッド(引数)」と いう形式でクラスの中の以下のnyuukinメソッドを呼び出して、に15000を足す動作を行っています。 このようにオブジェクトから呼ばれるメソッドをインスタンスメソッドと言います。
次に以下の説明をします。 クラスの中のshukkinメソッドを呼び出して、zandakaからkの値である10000を引く動作を行っています。 そして最後に の箇所で、以下のshowメソッドを実行しています。 showメソッドはzandakaの値をreturnで呼び出し元に返すだけのメソッドです。
結果は以下の通りです。 先ほどの例ではzandakaという変数が初めから定義されていますが、実はこれらの変数は初めからクラスの中で定義しなくても、後からでも付け加えることができるのです。
例えば「ginkou」という変数を付け加えようとする場合にはと言う形式で付け加えることができます。
例えば以下のように書きます。 では例をみてみましょう。 このginkou変数はshowメソッドで使われているのが分かります。
次の例に進みます。
インスタンス変数は前の例のの代わりに以下のようにクラスの中に初めから設定しておくことも出来ますので次の例をみてください。 この例のようにクラスの中にインスタンス変数を初めから設定することができます。
クラスの中で変数を設定する時には変数の前にオブジェクトを付ける必要はありません。 次の箇所の説明をします。 このようにオブジェクトからクラスのインスタンス変数の値を取得することもできます。
クラスの中の変数の値を取得するにはという形式で書きます。 これまでの例ではオブジェクトは1つだけでしたが、以下のように複数のオブジェクトを作成することができます。
以下の例では複数のオブジェクトごとにzandaka変数に値を入れていますが、これらのオブジェクト間で値の共有はありません。
つまり、新しくオブジェクトを作ったら、前のオブジェクトで使われていた変数の値は使われることはありません。
タグ: オブジェクト
クラスについて知ろう
この章ではクラスについて説明します。
今までのプログラムでは変数とメソッドを扱ってきましたが、クラスと言う機能を使うことで、多くの変数とメソッドを1つの機能体として働かせてデータを処理することが出来ます。
クラスとは物を作る設計図に例えられます。設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
例えば車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
鉛筆であれば「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」をメソッドで書くことになります。
その「状態」や「ふるまい」に指示を出すのはオブジェクトの役割です。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
クラスの基本構文は以下の通りです。 クラス名の初めの一文字目は大文字のアルファベットで書きます。
classとendの間に変数やメソッドなどを記述して、クラスの中身を作ります。
クラスはただの設計図なので、このクラスに指示を出す必要がありますが、それがオブジェクトです。 〇引数は省略できます。
〇このオブジェクトはインスタンスとも呼ばれています。
ではクラスの例を見てみましょう。 クラスの中に@ マークの付いている変数がありますが、これはインスタンス変数と呼ばれていまして、クラスの中で使われます。 =>オブジェクトの基本構文はと、説明しましたが、このオブジェクトを作成する過程でクラスの中のinitializeメソッドを自動的に呼び出してくれます。nyuukinメソッドやshukkinメソッドは自身で作ったメソッドですが、このinitializeメソッドはRubyであらかじめ定義されているメソッドです。
そしてこのの中の引数100000がinitializeメソッドの引数(この例ではc)に入ります。
他の言語ではコンストラクタと呼ばれる機能です。
このようにinitializeメソッドを使ってインスタンス変数に値を設定することが出来ます。
また以下の通り、初めからインスタンス変数に値を設定することもできます。
その場合にはのように引数を省略できます。 次に以下の箇所の説明をします。 =>クラス内のメソッドにデータを渡すにはという形式で書きます。
そうするとクラス内のメソッドが実行されます。
最後にshowメソッドを出力するとnyuukinメソッドやshukkinメソッドで計算された結果が入っている@zandakaが返されますので、これをprintで出力しています。
結果は「91000」です。
次の例はinitializeメソッドの引数にデフォルト値を設定する例です。 初期値を設定するときには以下のようにとデフォルト値を設定してください。
メソッドの章で説明した通り、メソッドにはあらかじめ値を設定することができます。 このようにメソッドに引数を設定した時にはオブジェクトの引数をカラにしても、そのメソッドの引数の設定値が使用されます。
先ほども説明しましたが、もう一度クラスの中のメソッドを呼び出す方法について説明します。
この例ではクラスの中で3つのメソッドを定義しています。 これらのメソッドを使用するためにはという構文で書きます(initializeメソッドだけはオブジェクトを作成過程で自動的に呼び出されるので、明示的にこの構文を使う必要はありません)。
この構文でメソッドにデータを入れていきます。この例では以下のように書いています。 引数が無い場合にはshowメソッドのように省略することができます。 これらのメソッドはオブジェクトからアクセスするのでインスタンスメソッドと言います。
今までのトップレベルのメソッドはのようにメソッド名だけでメソッドを呼び出していましたが、オブジェクトから呼び出す場合はで書くことを覚えておいてください。
次にインスタンス変数について説明します。
インスタンス変数はインスタンスメソッドからのみ参照できますので、メソッドを通してインスタンス変数の値を取得します。
ですので、この例ではすべてメソッドの中でインスタンス変数の値を足したり、引いたりしています。
では次の説明に進みます。
オブジェクトは1つだけではなく、次のように変数を変えていただくと何個でも作ることが出来ます。
例えばこの例ではbooksとbooks2の2つを作成しています。 オブジェクトをたくさん作成してもインスタンス変数はオブジェクトごとに値が設定されますので、booksの@zandakaとbooks2の@zandakaの間には関係性はありません。
結果は以下の通りです。
では次の例を見てみましょう。 では説明をしていきます。
initializeメソッドでインスタンス変数に値を設定することもできますし、setメソッド(メソッド名はsetを付けなくても構いません)を使っても値を設定することができます。
この例ではsetメソッドで設定した値でinitializeメソッドで設定した値を上書きしていますが、initializeメソッドで設定したデータよりsetメソッドで設定したデータの方が優先されます。
setメソッドだけで値を設定したい場合にはinitializeメソッドは書かなくても結構です。
ではsetメソッドについて説明します。
インスタンス変数に値をセットするためにはinitializeメソッドやsetメソッドを通常使用します。 =>「set..」というのはインスタンス変数の値を設定する時に使います。
特に「set..」で書かなくてはならないという決まりがあるわけではありませんが、解りやすいので慣習になっています。
通常はインスタンス変数ごとにsetメソッドを書きます。
次はgetメソッドについて説明します。 =>「get..」と言うのは値を呼び出し元に返す時に使います。
特に「get..」で書かなくてはならないと言う決まりがあるわけではありませんが、解りやすいので慣習になっています。
通常はインスタンス変数ごとにgetメソッドを書きます。
getメソッドは値を返すために作られるメソッドです。
結果は以下の通りです。 しかし、インスタンス変数の数だけ、このようなメソッドを書くのは面倒に思いませんか?
そこでRubyにはそれを簡潔にする機能が備わっています。
次の例で説明します。 では説明を始めます。
と、書くことで例えば本来ならばsetNameメソッドとgetNameメソッドを2つ書かなくてはいけませんでしたが、と書くだけでこれらの2つのメソッドと同じことを行わせることが出来ます。
このの中の変数に値を設定するにはという構文で入れていきます。
この例では以下のように入れています。 インスタンス変数の値を出力するにはという構文で記述します。
この例では以下の箇所です。 では次の例に進みます。 では説明を始めます。 「attr_writer :変数名」は以下のようなsetメソッドと同じ役割があります。 「attr_reader :変数名」は以下のようなgetメソッドと同じ役割があります。 使い方はと同じです。
クラスについて知ろう
この章ではクラスについて説明します。
今までのプログラムでは変数とメソッドを扱ってきましたが、クラスと言う機能を使うことで、多くの変数とメソッドを1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る設計図に例えられます。
設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を「変数」で書き、「ふるまい」をメソッドで書くことになります。
どのような「状態」や「ふるまい」を作りたいかはオブジェクトの役割です。
例えば「線を引く」「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
クラスの構文は以下の通りです。 クラスの中に変数やメソッドを書いていきます。
クラスの中の変数をフィールド変数と言います。
次にアクセスレベルについて説明します。
アクセスレベルとは変数やメソッドで使われますが、それらの変数やメソッドに対して、どこからアクセスできて、どこからアクセスできないかを決める修飾子です。
次はオブジェクトについて説明します。
オブジェクトはnew演算子を使って作成します。
オブジェクトとはクラスの中の「状態」を表す変数や「ふるまい」を表すメソッドに指示を出す役割があります。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。 オブジェクトを作る過程をインスタンス化と言います。
ではクラスで作ったプログラムの例を見てみましょう。 このプログラムは銀行でのお金の入金や出金のシステムを簡潔に作っています。2つのクラスがありますが、1つはMainメソッドのあるProgramクラスで、もう1つはGinkouクラスです。
初めにプログラムが実行されるMainメソッドのあるProgramクラスが司令塔になって、他のクラスに指示を出していくことになります。 クラスのフィールド変数には以下の構文でデータを入れます。 クラスのメソッドを実行するためには以下の構文で行います。 その結果、それぞれ以下のメソッドが実行されます。 これらのメソッドはインスタンス化(オブジェクトが作られてから)されてから実行されるのでインスタンスメソッドと呼ばれています。
それぞれのフィールド変数にデータが入ったところで、最後にresultメソッドで出力しています。
結果は以下の通りです。 この例ではProgramクラスを消して、Ginkouクラスにまとめています。
次はアクセスレベルのprivateについて説明します。
これまでのクラスのフィールド変数はpublicにしていますが、これは本来はよろしくありません。
クラスの外側から直接値を入れることが出来てしまうからです。
そこで、フィールド変数はprivateにして、メソッドからこれらのフィールド変数に値を入れる方が最良です。
そして、メソッドはpublicにするのが基本です。
例を見てみましょう。 この例ではすべてのフィールド変数にthisを付けていますが、前の例のように省略が出来ます。
オブジェクト指向プログラミングについて
この章ではオブジェクト指向プログラミングについて説明します。
オブジェクト指向プログラミングはC言語にはない機能であり、C++で新たに取り入れられた機能です。
オブジェクト指向型プログラミングは構造体に似た機能を持っています。
オブジェクト指向型プログラミングを使用すると変数と関数を1つにまとめることが出来ますが、この作業は「クラス」を使って行います。
つまり、「クラス」を使うことで、多くの変数と関数を1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る「設計図」に例えられます。
設計図は車や家や鉛筆などをつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引くなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」を関数で書くことになります。
どのような「状態」や「ふるまい」を作りたいかは「オブジェクト」の役割です。
例えば「線を書く」「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
では初めにクラスの基本から説明します。
クラスの中に「状態」を変数に書き、「ふるまい」を関数に書きます。
クラスの中の変数をデータメンバ、関数をメンバ関数と呼びます。
これをクラスの宣言と言います。 クラス名が2文字で構成されている場合、それぞれの単語の先頭を大文字で書いて、その他は小文字で書くのが慣例になっています(この通り書かなくてもエラーにはなりません)。
次はオブジェクトの作成方法について説明します。
オブジェクトについては先ほど以下のように説明しました。 つまりオブジェクトから命令を出してクラスに対して仕事をさせる役割があります。 今まではint型などの変数を作っていましたが、オブジェクトは「クラス型の変数」を作ることを意味します。
このオブジェクトを作る過程をインスタンスと言います。
ではクラスとオブジェクトの関係のイメージをつかむためにもう一度説明します。
例えば新築の家をつくるとします。
ある人は家にプールを作ったり、床暖房を付けます。
そのことを実現するには設計図に「プールや床暖房」や「その機能」を付け加えないといけません。
実際には設計図であるクラスの中にプール、床暖房という変数を設定し、プールや床暖房の機能を定義するために関数内で水や床の温度を上げたり下げたりする機能を加える必要があります。
この設計図はそのままでは動きませんので、誰かの指揮のもとに動かさなくてはいけません。
その指揮者の役割がオブジェクトです。
オブジェクトは例えば冬になったらプールの水の温度を40度にするなど細かな指示をすることになります。
では実際に例を見てみましょう。 改めてクラスの定義の記述方法について説明します。 クラスはデータメンバとメンバ関数からできています。
クラスの中の変数をデータメンバ、クラスの中の関数をメンバ関数と呼ばれていることは説明しました。
アクセス指定子とはメンバに対して、どこからのアクセスを許可するのかを指定するものです。
つまり、クラスは複数作ることが出来ますので、どのクラスからアクセスすることができるのかを規定するのがアクセス指定子です。 クラスの中ではアクセス指定子の右側に「:」を付けて、その下にメンバ関数やデータメンバを記述します。
クラスの中に宣言をした後は、メンバ関数の実際の中身をクラスの宣言の下(つまりクラスの外)に書いていきます。 例えばgetPoint関数は以下のように書いています。 クラスの宣言の中にメンバ関数の中身を書いていく方法もありますが、説明は後ほどします。
次にクラスの中のメンバ変数にデータを入れる方法について説明します。
この例ではクラス名をkeisanと名付けていますが、クラスはただの設計図なので、これにデータを入れないと何も動きません。
データを入れるには初めにのようにオブジェクトを作ります。この例では以下の箇所です。 オブジェクトを作った後はオブジェクト変数名にドット「.」を付け、その後にデータメンバを置きます。
そして、その中に代入演算子を使ってデータを入れていきます。
つまり、 という構文でデータを入れます。 そして、次はメンバ関数を呼び出しますが、実際にメンバ関数を呼び出しているのは以下の箇所です。 tasu関数の中では入力した数が0より大きくて、200より小さい値だった場合、number変数にb変数の値を足したものをnumber変数に代入しています。
数値がそれ以外の数だった場合は が実行されてでプログラムを終了させています。
次はobj.hiku(num2);の部分を説明します。 ここでは入力した数が0より大きくて、200より小さい値だった場合、number変数からc変数の値を引いたものをnumber変数に代入しています。
number -= c;はと同じ意味なので、tasu関数で計算されたnumber変数の値からC変数を引いた値をnumber変数に代入しています。
number変数にはtasu関数で計算された値が入っているので、hiku関数ではその値が使われます。
num1に5が入っているとするとの箇所でnumberには5と12が足された数値である17が代入されます。 num2に1が入っているとするとの箇所でnumberには17から1を引いた数値である16が代入されます。
numberには上の3番で17が入っていますので、この値が使われます。 getPoint関数はnumber変数の値を返すためだけに存在します。
次の例はアクセス指定子に「private」を指定した例をみてみましょう。 この例ではnumberにprivateを指定しています。
privateもpublicと同じくアクセス指定子です。
クラスの定義の中にデータメンバやメンバ関数を記述する時にはアクセス指定子を書くことになりますが、省略も出来ます。省略した場合にはデータメンバ、メンバ関数はprivateになります。 publicは同じクラスはもちろん他のクラスからもデータメンバやメンバ関数にアクセスすることが出来ます。
privateの付いたデータメンバにはクラスの外から直接アクセスできないので、メンバ関数からアクセスすることになります。
この例のnumber変数はprivateなので、以下のsetNumber関数からnumber変数に値を入れています。 ここで補足をしておきます。
publicやprivateはデータメンバやメンバ関数に付けますが、基本はデータメンバはprivateで、メンバ関数はpublicで指定します。
データメンバをpublicにするとどのような値でも入れることが出来るので思わぬ誤作動につながる可能性があります。
ですのでsetNumber関数のような関数を作って中身のをしてからデータメンバに値を代入する方が安全です。 次は関数の引数としてオブジェクトを使用する方法について説明します。
では例をみてみましょう。 この例で説明したい箇所は以下のs2関数です。
このs2関数はメンバ関数ではない普通の関数です。
この関数にアクセスする方法について説明します。 ここでの注目点は仮引数がのようにオブジェクト変数になっていることです。
このようにオブジェクト変数でデータを受け取ることも可能になっています。
ですのでs2関数を呼び出すときには実引数にオブジェクトを入れます。 このオブジェクトを使って、普通の関数s2の中でのように書くことで、メンバ関数のtriangleArea関数やsqureArea関数などの関数を呼び出すことができるようになります。
ではこのプログラムの説明をしていきます。 結果は以下の通りです。 次の例ではコンストラクタと言う機能を学びます。 コンストラクタとはオブジェクトを作成すると必ず呼び出される特殊な関数です。
データメンバをオブジェクト作成と同時に初期化したい時にコンストラクタを使用します。
オブジェクトを作成と同時に初期化することでデータメンバに対してデータを入れ忘れることはなくなります。
以下の箇所がコンストラクタですが、numberを初期化しています。 コンストラクタの基本構文は以下の通りです。 引数があれば書きますが、無ければ書かなくても結構です。
引数を書かない場合にはコンストラクタの中でのように直接データを入れます。 引数のあるコンストラクタは以下の箇所です。 そして、コンストラクタは必ずクラスの宣言の中のpublicの中で宣言をしてください。
次にコンストラクタを呼び出す方法について説明します。
基本構文は以下の通りです。 この例のコンストラクタの呼び出しは引数が無い場合にはのように引数なしで記述し、データを渡したい時にはのように引数を書いています。
「keisan obj;」で呼び出されるコンストラクタは以下の箇所です。 「keisan obj2(5); 」で呼び出されるコンストラクタは以下の箇所です。 このようにコンストラクタは引数の型や数が違うならば同じ名前のコンストラクタを複数定義することが出来ます。
この例では引数のあるコンストラクタと引数のないコンストラクタなのでオーバーロードが可能になっています。
結果は以下の通りです。 [補足2]
クラスの中にもインライン関数を書くことが出来ます。
通常、インライン関数を書くときにはinlineを付けますが、クラス宣言の中にインライン関数を書くときにはinlineを付けなくても、インライン関数としてみなされます。
以下の赤線で囲まれている箇所がインライン関数です。
通常の関数の書き方で書きます。
他のtasu関数などもクラスの中に書いても結構です。
クラスについて知ろう
今までのプログラムでは変数とメソッドを扱ってきましたが、クラスと言う機能を使うことで、多くの変数とメソッドを1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る設計図に例えられます。
設計図は車や家や鉛筆などをつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」をメソッドで書くことになります。
その「状態」や「ふるまい」に指示を出すのはオブジェクトです。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
では以下のHairDryerクラスで説明します。
以下の例ではクラスの大まかな事だけを説明します。 クラスの基本構文は以下の通りです。 アクセルレベルとはpublicの部分ですが、どのクラスからでも接続出来るクラスを作る場合にpublicにします。
「class クラス名」のようにpublicを付けなかった場合はパッケージ内部からは接続できますが、外部からは接続できないクラスを作ることができます。
パッケージについては「パッケージについて知ろう」で説明します。
クラスに指定できるアクセスレベルはとの2つのみです。
次はフィールド変数について説明します。
クラスの中に書かれた変数をフィールド変数と言います。
フィールド変数の基本構文は以下の通りです。 先ほどの例の中では以下の部分がフィールド変数です。 例えば
public int temperature;は温度の設定
public int wind;は風の強さ
public int price;はドライヤーの値段を決めるなどと仕様を決めます。
次はメソッドについて説明します。 HairDryerクラスのメソッドはshowTemperatureですが、これは温度を表示するメソッドです。
このように必要なメソッドを自身で作成していきます。
次にアクセスレベルについて説明します。
HairDryerクラスのフィールド変数やメソッドにはpublicが付いていますので、すべてのクラスでフィールド変数やメソッドを使用することができます。
次はオブジェクトの作成方法について説明します。
先ほど、「状態」や「ふるまい」に指示を出すのはオブジェクトです。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出しますと書きましたが、そのオブジェクトの作り方を説明します。
通常はmainメソッドの中にオブジェクトを作成します。
オブジェクトの基本構文は以下の通りです。
オブジェクト変数名は変数での命名規則に従って、名づけを行います。
このオブジェクトはインスタンスとも呼ばれています。 ではオブジェクトを作っていきます。
オブジェクトはnew演算子を使って作成しますがHairDryerクラスでは以下のようにオブジェクトを作成しています。
このオブジェクト変数から、様々な指示をフィールド変数やメソッドに出していきます。 普通の変数はのように型名を先頭に付けて宣言しますが、オブジェクトを作成する時にはクラス名を先頭に付けて宣言しますので、クラスはクラス型と思ってください。
次はクラスの中のフィールドやメソッドにデータを入れる方法について説明します。
フィールド変数には以下の形式でデータを入れます。 この例ではオブジェクト変数がmachineなので、のような形式でデータを入れていきます。
次はHairDryerクラスのメソッドを呼び出す方法について説明します。
以下の構文でメソッドを呼び出します。 HairDryerクラスのshowTemperatureを呼び出すにはと、記述します。
では実際にクラスの例を見てみましょう。このプログラムは銀行でのお金の入金や出金のシステムを簡潔に作っています。
の箇所でGinkou22クラスのオブジェクトを作成していますので、ここから指示を出していきます。
次の箇所でデータを入れています。 図にすると以下のようにフィールド変数にデータを入れています。 もう一つフィールド変数にデータを入れる方法がありますので次で紹介します。
それは次のように初めからクラスの中のフィールド変数にデータを入れておくことです。
では次はメソッドにデータを渡してみましょう。
mainメソッドの中の次の箇所でメソッドにデータを渡しています。
具体的には という形式で、Ginkou22クラスのメソッドにデータを渡しています。 このメソッドはインスタンスされてから実行されているのでインスタンスメソッドと呼ばれています。
次はthisの意味について説明します。
プログラムの中にthisと言う文字がありますが、thisはインスタンスメソッド もしくは これから説明するコンストラクタの中で使用され、オブジェクト自身を指します。
例えば使い方はインスタンスメソッドの中でフィールド変数名とローカル変数名が同じ時にフィールド変数を指し示す場合などに使います。 上の例で説明しますとフィールド変数であるkingakugoukeiとnyuukinメソッドの中の引数が同じ名前ですが、フィールド変数であるkingakugoukeiを指し示すときにthisを使います。
この例のようにフィールド変数とローカル変数の名前が違えば特にthisは付ける必要はありませんが、付けても問題ありません。
では次の箇所の説明に入ります。 =>このtoStringメソッドはObjectクラス(「クラスについての雑学を知ろう」で説明します)で規定されているメソッドですので、それを自身のクラス(Ginkou22クラス)でオーバーライドして使っています。
オーバーライドとは同じメソッド名のメソッドを「内容を変えて引き継ぐこと」を言います。
toStringメソッドは少し特殊でで出力するときにはを省略できます。
つまり、例では以下のように書いていますが、 以下のようにtoString()を付けなくても同じ意味になります。 結果は以下の通りです。
次の例に進みますが、クラスを2つに分けています。1つは通常のクラスであるGinkou109で、もう一つはmainメソッド専用のMain190クラスです。
2つのクラスファイルを別々にコンパイルした後に、Main190クラスを実行すると結果が表示されます。
このようにクラスは分けることが出来ます。 次の例は「Main190.java」です。 この例では「コンストラクタ」について説明します。
これまでは以下のように1つ1つデータを入れていましたが、銀行のシステムでこの中のどれか1つでもデータを入れ忘れたら大変なことになります。 しかし、コンストラクタと呼ばれる機能を使うことによって、オブジェクトを作成時に自動的にデータをフィールド変数にセットすることが出来ます。 コンストラクタには戻り値の型は書きません。
例では以下の箇所がコンストラクタです。 ではコンストラクタのアクセスレベルの説明を始めます。
次はコンストラクタを呼び出す方法について説明します。
コンストラクタの呼び出しは以下の通り書きます。 この例では以下の箇所がコンストラクタの呼び出しの箇所です。 このように書くことでインスタンスの過程で1000、五十嵐銀行、近藤栄治の各データがそれぞれコンストラクタのにセットされることになります。 実はコンストラクタを明示的に作成しない場合はJavaが自動的に引数やデータがカラのコンストラクタを作ってくれます。
例を見てみましょう。 コンストラクタを書かない時にJavaは引数もデータもない以下のようなコンストラクタを暗黙的に作成します。
この場合のコンストラクタは暗黙的に作られるので、明示的にプログラム上に書くわけではありません。これはデフォルトコンストラクタと呼ばれています。 例えばこの例では以下のデフォルトコンストラクタが作成されます。 super()とは親クラスのコンストラクタを呼び出すという意味ですが、次章でクラスの継承を説明するので、その時に詳しく説明します。
次の例ではコンストラクタの注意点について説明します。 では説明を始めます。
のように引数のない形式でオブジェクトを作っているにも関わらず、次のように引数のあるコンストラクタだけを作ってしまうとエラーになります。 1つでも引数のあるコンストラクタを作ってしまうと、デフォルトコンストラクタが作成されませんので注意してください。
このためにも、引数有りのコンストラクタ作る時には、引数無しのコンストラクタも次のように作ってください。 では例をみてみましょう。 結果は以下の通りです。オブジェクトが2つありますが、具体的な説明は次の例で説明します。 しかし、上の2つのコンストラクタの書き方は同じことを2回書いているのであまり、いい書き方とは言えません。 そこで以下の箇所をスマートに書き換える方法について説明します。 上の例を書き換えると以下のようになります。 ではこの箇所のthisについて説明します。
this(引数1,引数2…..)と書くことで引数のあるコンストラクタを呼び出すことが出来ます。
thisの中の引数は引数のあるコンストラクタの引数の数や型を合わせてください。
ちなみに今まで使用してきたとは似ていますが、違うものです。
では次に進みますが、今度は複数のオブジェクトを実行する方法について説明します。
次の例は「Ginkou333.java」です。 次は「Main2.java」です。 このようにオブジェクトは何個でも作ることが可能です。
例ではGinkou333クラスのaとbの2つのオブジェクト変数を作成しています。 は引数が無いので以下のコンストラクタが適応されます。 は引数があるので以下のコンストラクタが適応されます。 結果は次の通りです。
クラスについて知ろう
この章ではクラスについて説明します。
今までのプログラムでは変数と関数を扱ってきましたが、クラスと言う機能を使うことで、多くの変数と関数を1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る設計図に例えられます。
設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品にはがあります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態やふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」を関数で書くことになります。
その「状態やふるまい」に指示を出すのはオブジェクトです。
例えば線を消すなど具体的な指示をオブジェクトと言う司令塔から出します。
「状態」は変数で書くと言いましたが、クラスの中の変数のことをプロパティと言います。
「ふるまい」は関数で書くと言いましたが、クラスの中の関数のことをメソッドと言います。
では初めにクラスの基本から説明します。
クラスの中に「状態」や「ふるまい」を書いていきます。 クラス名の付け方は基本的には変数名の付け方と同じですが、変数との違いは大文字と小文字を区別しないことです。
例えばとは同じクラスを意味します。
その他にクラス名の付け方で気を付けることは最初の文字を大文字にして後は小文字というのが慣例になっていることです。 オブジェクトを作成するためにはクラス名の前にを付けます。
これをオブジェクト変数に代入すればオブジェクトの完成です。
このオブジェクトを作る過程を「インスタンス化」と言います。
クラスはただの設計図なので、オブジェクトから指示を出さないと何も動きません。
先ほども説明しましたが、「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
ではクラスとオブジェクトの関係をもう一度説明します。
例えば新築の家をつくるとします。
そこで、家にこんな機能を付けたい、あんな機能も付けたいと思い悩むことでしょう。
ある人はプールや床暖房を付けたり。
それを実現するには設計図にその「プールや床暖房」やプールや床暖房を操作する機能を付け加えないといけません。
実際にはクラスの中にプール、床暖房という変数を設定し、プールや床暖房を実際に機能させるためにメソッドの中で水や床の温度を上げたり下げたりする機能を加える必要があります。
この設計図はそのままでは動きませんので、誰かの指揮のもとに動かさなくてはいけません。その指揮者の役割がオブジェクトです。
「オブジェクト」は例えば冬になったらプールの水の温度を40度にするなど細かな指示をします。
ではクラスの例を見てみましょう。 このクラスにはBanksystemという名前が付いています。
以下の変数がプロパティです。
プロパティの前にpublicが付いていますが、これはプロパティに対してクラスの外からでも、どこからでもアクセスが出来ることを意味します。
publicは修飾子と呼ばれています。
修飾子はこの他にもprivate、protectedなどがありますが、後ほど説明します。 以下のようにメソッドの前にpublicが付いていますが、これはメソッドに対してクラスの外からでも、どこからでもアクセスが出来ることを意味します。
次はクラスを実行する方法について説明します。
クラスは設計図なのでこのままでは何も機能しません。
クラスを機能させるためには以下のようにオブジェクトを作成しなくてはいけません。
それが$Bankです。作り方は説明した通り、クラス名の前にnewを付け、それを変数に代入すればオブジェクトの完成です。
次にプロパティにデータを入れていきます。
以下のようにデータを入れます。 $オブジェクトとプロパティの間にある「->」はアロー演算子と言います。
クラスのプロパティやメソッドにアクセスするときに使います。
次はメソッドにデータを入れます。 メソッドの場合には「=」を使わないで、メソッドの引数に渡したいデータを入れます。
次にプロパティをクラスの中で使用する方法について説明します。
クラスの中でプロパティやメソッドを使用するためには「$this->」を使用しなくてはいけません。
ですので、メソッドの中でプロパティを使用するためには次のように「$this->」を使用します。 結果は「山田銀行の近藤次郎様の残高は240000」となります。
オブジェクトは何個でも作成することが出来るので、次の例をみてみましょう。
先ほどの例は$Bankオブジェクトだけでしたが、オブジェクトはいくつでも作成することが出来ます。
以下の例では$Bank1を付け加えました。
次にプロパティに対してクラスの外からのアクセスを禁止する場合の対処法について説明します。
先ほどの例との違いは以下のsum関数と$moneysumの箇所です。 プロパティに対してクラスの外からのアクセスを禁止する場合にはプロパティの前にprivateを付けます。
privateにする理由はクラスの外から自由にプロパティの値を書き替えられては困る場合などに使われます。
privateを付けますと、クラスの外部から直接プロパティに対してのようなアクセスはすることが出来なくなります。
では、このprivate指定のプロパティにどのようにデータを入れるのかと言いますとメソッドを通してデータを入れます。
それが以下のsumメソッドです。
このsumメソッドは入力したデータが0より小さい場合には0を$moneysumに代入するというチェック機能を付けました。
deposiメソッドやwithdrawalメソッドにはチェック機能を付けませんでしたが、sumメソッドのようにマイナスの値が入らないようにif文でチェックしています。
次は「コンストラクタ」といわれる機能について説明します。
例をみてみましょう。ではコンストラクタの機能について説明します。 functionの次のアンダーバーは2つあることに注意してください。
コンストラクタの修飾子は必ずpublicです。
また、引数は省略できます。
この機能はコンストラクタと言いまして、オブジェクトを作成するときに自動的に呼び出されるメソッドです。
つまり、newによってオブジェクトが作られるときに自動的に呼び出されるメソッドです。
これは変数を初期化したい時に使用します。
コンストラクタを呼び出すには以下の通り、オブジェクトの引数に渡すデータをなどと記述します。
引数がない場合には省略できます。 以下のようにオブジェクトを作成するときに自動的にコンストラクタが呼び出され、引数の値がそれぞれコンストラクタの引数に代入されます。
次は静的メソッドと静的プロパティについて説明します。
静的メソッドや静的プロパティはオブジェクトを作成しなくてもアクセスすることができるメソッドやプロパティで、オブジェクトからデータを入れたりすることはできません。
静的メソッドや静的プロパティの作成方法はメソッドやプロパティの前にstaticを付けるだけです。
ここでいくつかの注意点を説明します。
〇「$this->」 はstaticメソッドの内部で使用することはできません。
〇静的メソッドや静的プロパティには前の例の のようにを使ってアクセスすることはできません。
〇静的メソッドや静的プロパティはクラスに属しているメソッドやプロパティです。
今まではクラスのオブジェクトを作成して、そのオブジェクトからメソッドやプロパティにデータを入れてきました。
なぜなら、それらのメソッドやプロパティはオブジェクトに属しているからです。
例えば以下の$Bankオブジェクトと$Bank1オブジェクトで使われるプロパティとメソッドは同じものを使っていますが、各データはそれぞれのオブジェクトの持ち物ですので、共通して使えるデータはありません。 それに対して静的メソッドや静的プロパティは各オブジェクトが共通して使えるデータです。
では先ほどの例を見てみましょう。
の箇所が静的プロパティですが、そのプロパティには0が代入されています。
この$totalプロパティは「クラスに属しています」。
次に静的プロパティにアクセスしてみましょう。
今まではを使っていましたが、は静的メソッドや静的プロパティでは使えないので、代わりにという形式を使います。
以下の箇所ではコンストラクタが呼び出されるごとに$totalに1が足されていきます。 ですので、1回目のコンストラクタの呼び出しで$totalに「1」が足されるのででは「1人目山田銀行の近藤次郎様の残高は240000」と出力されます。
2回目のコンストラクタの呼び出しで「1」である$totalにさらに「1」が足されるのででは「2人目山田銀行の近藤次郎様の残高は240000」と出力されます。
$Bankオブジェクトと$Bank1オブジェクトが1つの$totalを共通して使っていることが分かります。
これは説明した通り、$totalがクラスに属しているからです。