はじめに
この課題が終われば、もう簡単なコードは読めるはずです !
構造的な話で言えば、これまでやってきたこと以外で、 javaのコードは成り立っていません。
それくらい大切な部分です。よくわかんないのは最初だけです! 焦らず慣れて行きましょう慣れていきましょう。
Step1: mainメソッド
mainメソッドはJavaのプログラムにおける全ての始まりです↓
mainメソッドの決まり事①
mainメソッドは特別なメソッドです。
一番最初にmainメソッドの処理が実行されるため、「プログラムのエントリポイント(入り口)」と考えるとよいでしょう。
mainメソッドの決まり事②
mainメソッドは一つのクラスに一つしか記述することができません。
mainメソッドの決まり事③
mainメソッドは、「public static void main(String[] args) 」 という形式で記述します。
一字一句間違えないように記述しましょう。
また、mainメソッドは String の配列、 args という名前の引数を持っています。 明確な使い所はありますが、今は頭の片隅にでも入れておきましょう。
Step2: インスタンス
インスタンスとは、クラスの実体のことです。
クラスはint や boolean と同じようにひとつの型でありそのままでは使うことができません。
使うためには、インスタンス化という作業が必要になります。
クラスは構成する概念や情報は存在するけれど、 具体的な状態ではありません。
それ故、クラスは何かの設計図と例えられることが多いですが、そのフワッとしたイメージを形にする作業がインスタンス化です。
ざっくりですが、例えば、
CADというツールから家の製図を作成すれば、作成された図面を元に大工さんが家を組み立てて家が完成します。
「皆さんが広告やチラシで目にする家の間取り=クラス」で、「実際に居住可能になった家=インスタンス化された実体」
といった感じでしょうか。
この概念の正解はひとつとは限らないため、この説明がしっくりくる方はより内容を深め、 逆にしっくりこない方は似たような考え方を用いてイメージを膨らませることが重要となります!
偏らずに色々な考え方ができると内容の理解も多少スムーズになります!
(Step3でも似たような考え方で説明していきます!
Step3: クラス型
例えば Taiyaki というクラスの変数であれば Taiyaki tai = new Taiyaki ();
のように記述して、new演算子によりTaiyakiクラスを呼び出して tai という名前で使用可能な状態にします。
このように、そのクラスを呼び出して使用できるようにすることを、クラスのインスタンス化 (実体化)と呼びます。
また、生成されたもの (実体)をインスタンスと呼びます。
たい焼き型(クラス)をインスタンス化してたい焼き (実体)を作るみたいなイメージです。
生成されたインスタンスをもとにしてそのクラスに宣言してあるフィールドを参照したり、 定義してあるメソッドを呼び出したりすることができるようになります。
インスタンスの生成は、他のクラス内やmainメソッド内など、さまざまな場所で行うことができます。
例
例えば下記に示すものは、 Exampleクラスのインスタンスを生成する記述です。
①クラス名
②インスタンス名(変数名)
③「=」で結んで、 new演算子
④コンストラクタ名
の順で記述します。
上記のインスタンスを生成した例ですが、 最初のクラス名 「Example」と最後のコンストラクタ名 「Example()」が同じです。
これは、前のページのコンストラクタの説明にもあるように、コンストラクタ名=クラス名であるためです。
また、インスタンスを生成するクラスのコンストラクタによっては引数の値を与えてインスタンスを生成しなければなりません。
これはインスタンスを生成するクラスのコンストラクタの作り方によって左右されます。
Step4: メソッドの呼び出し (メソッドの実行)
メソッドの呼び出しとは、作成したクラスのインスタンスを生成してから「インスタンス名 メソッド名()」という形式でメソッドの呼び出しを行うことです。
例えば下記に示すものは、インスタンス名 tai が eat という名前のメソッドを呼び出す例です。 tai.eat();
クラスのメソッドによっては、引数の値を与えてメソッドの呼び出しを行わなければなりません。 インスタンス名 メソッド名(引数の値);
Step5: カプセル化
カプセル化とは、作成したクラスのデータ(フィールド)や処理(メソッド)を他のクラスから隠蔽することで、作成したクラスに対するアクセス方法を限定するプログラミング技法です。
隠蔽などと難しい表現をしていますが、 その実体は private です。
必要性は?
「カプセル化」することによって作成したクラスが何をしてくれるクラスなのかが明確になり、他のクラスから使用しやすくなります。
また、オブジェクト指向においてはそのようにプログラミングするのが一般的です。
具体的には、通常はフィールドのアクセス修飾子を private にして、 メソッドのアクセス修飾子を public にしておきます。
そのようにすれば大概はカプセル化になっています。
アクセス修飾子の復習
アクセス修飾子とは、public protected private といった修飾子のことで、
クラスや変数がどこからアクセス可能であるかを決定します。
例えば、猫をクラスとして考えてプログラミングしていきます。
Cat クラス
Main クラス
【実行結果】
このCatクラスは、フィールドに 猫の名前と年齢を持っています。
コンストラクタでは、引数に猫の名前と年齢の値を受け取り、それをもとにインスタンスを生成します。
Step6: フィールド変数の設定
名前の設定
名前(name フィールド)は、private のアクセス修飾子がついているため、このCatクラス内からしかアクセスできません。
Catクラス内では、 name に対する代入はコンストラクタでのみ行っています。
よって、 Catクラスを使用する他のクラスがCat内の名前(name )を設定できるのは、
Catのコンストラクタを呼び出すとき (インスタンスを生成するとき) のみに制限されています。
年齢の設定
これに対して、年齢(age フィールド) は public であるため、Catクラス以外の他のクラスからも自由に値を参照したり変更したりすることができるようになってしまっています。
このため、インスタンス生成時に年齢を設定したあと、別の任意のタイミングで年齢の値を書き換えることができてしまいます。
上記の例では、
①Mainクラスのmainメソッド内で、 Catクラスのインスタンスpepeをまず3才として生成
②pepeに対してagePlus() メソッドを呼び出して歳をとらせています。
これにより pepeは4歳になりました。
ここまでは正常ですが、 その後、pepe.age = 0; の代入文により、年齢の値を不正に0にしてしまっています。
このageフィールドのように、 カプセル化がされていないと如何様にも年齢の値の書き換えが可能になるという危険性があります。
せっかく猫の歳をとらせるためのメソッドとしてagePlusメソッドを用意して、年齢を正しく加算させる操作を提供していても、年齢の値を勝手に書き換えられてしまっては元も子もありません。
しっかりとカプセル化されていれば、このようなことは無くなり一本筋の通ったプログラムになります。
さらに加えると、上記の例の場合、値がint型の範囲ならばエラーにならないため、 -100 (歳)というような年齢を入れられてしまう可能性もあります。
値の格納を必ず 「メソッドを介して行う」ように徹底すれば、チェックロジックを入れることができるため、そのような不正な値の操作を回避することもできます。
【チェックロジックのサンプル】
仮に直接 age に値を設定してOKとした場合に、age に設定する値をチェックするロジックになります。
課題
Java 中級からはEclipseでの課題対応となります。
2-7のフォルダの中にプロジェクトがありますので、インポートして以下の画像のように出力されるようにコーディングしなさい。
