~手続き指向からオブジェクト指向へ(Ⅰ)~ 第4回 クラスとインスタンス ~手続き指向からオブジェクト指向へ(Ⅰ)~
学習目標 クラスとインスタンスの簡単な説明ができる クラスとインスタンスの違いを説明できる クラスとインスタンスを使って、変数をまとめたプログラムが書ける クラスとインスタンスを使って、メソッドをまとめたプログラムが書ける
そろそろ商品名、価格を扱おう 1001は販売中です 1003は販売中です 1001:コーラ:120円は販売中です 1003:お茶:120円は販売中です
引数がいっぱい public static void add(int[] targetArray,int addID) 先週 (Example3_2.java) public static void add(int[] targetArray,int addID) 例題4-1 (Example4_1.java) public static void add(int[] targetIdArray,String[]targetNameArray, int[] targetPriceArray,int addID, String addName,int addPrice)
意味が明確なプログラムに 本当にやりたいこと 「商品種類」を「追加」する
データは意味ごとにまとめる 配列とのちがいは? 商品番号=1003 商品名="お茶" 価格=120 商品番号=1001 商品名="コーラ" 商品番号=1002 商品名="ソーダ" 価格=120
オブジェクトとして考えよう 意味のあるデータをまとめてオブジェクトにする→オブジェクト指向の基本です コイツラはみなオブジェクト(もの) 商品番号=1003 商品名="お茶" 価格=120 商品番号=1001 商品名="コーラ" 価格=120 商品番号=1002 商品名="ソーダ" 価格=120
オブジェクトを作るには? Javaによるオブジェクト指向プログラミングでは、いきなりオブジェクトは作れません。 クラスという概念を使います
クラスって何?(1) オブジェクトを製造する型のことです。 型がないとオブジェクトは作れない。 インスタンス化 クラス (タイヤキの型) (実際のタイヤキ)
クラスって何?(2) クラスは、「変数」を複数まとめてセットで定義することができます。 int 商品番号; String 商品名;
クラスとインスタンスを使おう! 今回は、クラスとインスタンスを使って、商品名と商品番号をセットで扱いましょう。 クラス インスタンス 商品番号=1001 商品名="コーラ" 価格=120 int 商品番号; String 商品名; int 価格; 商品番号=1003 商品名="お茶" 価格=120 商品番号=1002 商品名="ソーダ" 価格=120 クラス インスタンス
Javaでプログラミングしてみよう! クラスを定義する クラスをインスタンス化してオブジェクトを作る オブジェクトの変数に代入する
クラスを定義する(1) /** *商品種類クラス */ public class ItemType{ } ① ② ③ ① ② ③ ①そのクラスの「可視性」(あとで説明します)を定義します。 ②「クラス」を定義しますよと言う意味です。省略できません。 ③クラスの名前です。省略できません。任意の名前を付ける ことができますが、慣習として、頭文字は大文字にします。 (第1回の命名規則を参考に)
クラスを定義する(2) 変数を定義します public class ItemType{ int id;//商品番号 String name;//商品名 int price;//価格 } 商品番号を整数型(int)で 商品名を文字列型(String) 価格を整数型(int)で定義します <商品種類> 商品番号: 商品名: 価格: これらをクラスの “属性”と呼びます
クラスごとに別ファイルに Example4_1.java ItemType.java ファイル名とクラス名を同じにすること! public class Example4_1{ … } public class ItemType{ … … } Example4_1.java ItemType.java ファイル名とクラス名を同じにすること!
クラス完成! これでクラスは完成です。 ItemTypeクラスを使うプログラム(Example4_1)をコンパイルすれば、自動的にItemTypeもコンパイルされます。 ただし、同じフォルダに入れておくこと!
オブジェクトを作る オブジェクトはExample4_1クラスのmain()メソッドで作ります。 例題4-1 public class Example4_1 { public static void main(String[] args) { //商品種類(コーラ)をインスタンス化する ItemType cola; cola = new ItemType(); cola.id = 1001; cola.name = “コーラ”; cola.price=120; } }
クラスは変数の型になる クラスはint,Stringなどと同じように変数の型として考えます。 ItemType cola; cola
オブジェクトを生成する オブジェクトを一つ作るには、new演算子を使います。 new ItemType(); id= name= price= ItemTypeクラスのオブジェクトを 一つ作る
オブジェクトに名前を付ける 作っただけでは使えません。宣言しておいた変数に代入するとオブジェクトに名前を付けることができます。 id= name= price= ItemType cola; cola = new ItemType(); cola ItemType型 1行で書くと ItemType cola = new ItemType();
オブジェクトが持つ変数に代入するには 「オブジェクト名.変数名」 cola.id = 1001; cola ItemType型 name= price= cola ItemType型 cola.id = 1001; colaという変数に入っている オブジェクトの、id変数に1001を代入する
オブジェクトを作って 表示するだけのプログラム 例題4-2 (Example4_2.java) public class Example4_2 { //メイン public static void main(String[] args) { //自動販売機プログラムの開始を知らせる System.out.println(“自動販売機のサービスを開始しました。"); //商品種類を追加する //コーラ商品種類クラスをインスタンス化(生成)して追加する ItemType cola = new ItemType(); cola.id = 1001; cola.name = "コーラ"; cola.price = 120; //コーラを表示してみる System.out.println(cola.id+":"+cola.name+":"+cola.price+"は販売中です"); }
前回のプログラムで 商品名を扱えるようにする 前回までのプログラムでは、intの配列を使って、商品種類の管理を行いました。 手続き指向になっているカナ?? 今回は、ItemTypeの配列を使って、商品種類の管理を行います。 商品名が扱えるようになります。
ItemTypeの配列を作る [0] [1] [2] [3] [4] [5] 続くよ ItemType型 itemTypeArray(配列全体の名前)
クラスの配列を作る (Javaでの記法) intの時と基本的には同じです。 [0] [1] [2] [3] [4] [5] 続くよ ItemType型 ItemType[] itemTypeArray = new ItemType[10];
intの配列との大きな違い intの配列のとき、配列には初期値として、 0が入りました。 [0] [1] [2] [3] [4] [5] [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] int型 intの配列のとき、配列には初期値として、 0が入りました。
ItemType型の初期値 [0] [1] [2] [3] [4] [5] 続くよ ItemType型 初期値には「何も入っていません!!」 オブジェクトが何も入っていない状態のことをnullといいます。 だから前回までは「-1が入っていたら、商品種類リストが入っていない」 ということでしたが、 今回からは「何も入っていなかった(null)ら、商品種類リストが 入っていない」ということになります。
ItemType配列への代入 [0] [1] [2] [3] [4] [5] 続くよ id=1001 name="コーラ" price=120 [0] [1] [2] [3] [4] [5] 続くよ ItemType[] itemTypeArray = new ItemType[10];//配列を作る itemTypeArray[0] = new ItemType();//ItemTypeオブジェクト を作って配列へ代入 itemTypeArray[0].id = 1001; itemTypeArray[0].name = “コーラ”; itemTypeArray[0].price = 120;
入ってない(nullの) 変数に、代入/参照するな! 次のプログラムを実行してみましょう。 //これはまずいプログラム public class FailProgram{ public static void main(String[] args){ ItemType[] itemTypeArray = new ItemType[10];//配列を作る //itemTypeArray[0]はnull itemTypeArray[0].id = 1001; itemTypeArray[0].name = “コーラ”; itemTypeArray[0].price = 120; }
Javaの文法復習⑦ 例外 前ページのプログラムを実行すると、 NullPointerExceptionと表示がでてプログラムがとまります。 これは、オブジェクトが入っていないのに代入/参照したので、処理できません。プログラムを終了します。という意味です。あなたのプログラムのバグです。 この他にも例外があります。 ArrayIndexOutOfBoundsExceptionは、配列にはない番地(例えば10個の配列の[10])を読もうとしましたよという意味です。あなたのプログラムのバグです。
ItemType配列を 使った今回の管理プログラム 追加だけを行うプログラム 例題4-3 (Example4_3.java) /** * 商品種類を追加する */ public static void add(ItemType[] targetArray,ItemType addItemType){ //商品種類が入っていない箱をさがして格納する for(int i=0;i<10;i++){ if(targetArray[i] == null){//入っていない targetArray[i] = addItemType;//書き込む break; }
追加メソッドの変更 今回の プログラム 前回までの プログラム public static void add(ItemType[] targetArray,ItemType addItemType){ //商品種類が入っていない箱を探して格納する for(int i=0;i<10;i++){ if(targetArray[i] == null){//入っていない targetArray[i] = addItemType;//書き込む break; } 今回の プログラム 前回までの プログラム public static void add(int[] targetArray,int addId){ //商品種類が入っていない箱を探して格納する for(int i=0;i<10;i++){ if(targetArray[i] == -1){//入っていない targetArray[i] = addId;//書き込む break; }
mainメソッドの変更 まだ3つだからいいけど、 たくさんになったら大変だ。 何とか見やすく方法は ないかな? 例題4-3 (Example4_3.java) //商品種類をインスタンス化する //コーラ ItemType cola = new ItemType(); cola.id = 1001; cola.name = “コーラ”; cola.price = 120; //ソーダ ItemType soda = new ItemType(); soda.id = 1002; soda.name = “ソーダ”; soda.price = 120; //お茶 ItemType greentea = new ItemType(); greentea.id = 1003; greentea.name = “お茶”; greentea.price = 120; まだ3つだからいいけど、 たくさんになったら大変だ。 何とか見やすく方法は ないかな?
Javaの文法復習⑧ コンストラクタ コンストラクタを使って読みやすくする //商品種類をインスタンス化する //コーラ ItemType cola = new ItemType(); cola.id = 1001; cola.name = “コーラ”; cola.price = 120; //ソーダ ItemType soda = new ItemType(); soda.id = 1002; soda.name = “ソーダ”; soda.price = 120; //お茶 ItemType greentea = new ItemType(); greentea.id = 1003; greentea.name = “お茶”; greentea.price = 120;
コンストラクタ(1)宣言 //簡単なコンストラクタをつけたItemTypeクラス public class ItemType{ 例題4-4 (ItemType.java) //簡単なコンストラクタをつけたItemTypeクラス public class ItemType{ int id; String name; int price; public ItemType(){ } 同じ名前にすること! ☆クラス名と同じ名前で、メソッドのようなものを 宣言します。 ☆メソッドと違ってvoidなどの返り値宣言 がいりません。(staticもいりません)
コンストラクタにも引数を書くことができます。 コンストラクタ(2)引数 例題4-4 (ItemType.java) //引数をつけたコンストラクタのあるItemTypeクラス public class ItemType{ int id; String name; int price; public ItemType(int newId,String newName,int newPrice){ } コンストラクタにも引数を書くことができます。
id,name,priceに値が代入されます。 コンストラクタ(3)代入 例題4-4 (ItemType.java) //引数を代入するコンストラクタを持つItemTypeクラス public class ItemType{ int id; String name; int price; public ItemType(int newId,String newName,int newPrice){ id = newId; name = newName; price = newPrice; } id,name,priceに値が代入されます。
属性はクラススコープの変数 idとnameとpriceの有効範囲 //引数を代入するコンストラクタを持つItemTypeクラス public class ItemType{ int id; String name; int price; public ItemType(int newId,String newName,int newPrice){ id = newId; name = newName; price = newPrice; } idとnameとpriceの有効範囲
コンストラクタ(4)呼び出し 1001と"コーラ"と120が実引数として渡され、 コンストラクタが呼ばれることによって、 例題4-4 (Example4_4.java) //コンストラクタを呼び出してインスタンス化する例のプログラム public class Example{ public static void main(String[] args){ ItemType[] itemTypeArray = new ItemType[10]; ItemType cola = new ItemType(1001,”コーラ”,120); add(itemTypeArray, cola); } … 1001と"コーラ"と120が実引数として渡され、 コンストラクタが呼ばれることによって、 できたてのcolaオブジェクトに変数が既に代入されています
もっと簡略化 colaという変数をあとで使う必要がないので、 インスタンス化して、そのままメソッドの実引数 として使います。 //前ページの例を余計な変数を使わないようにしたプログラム public class Example{ public static void main(String[] args){ ItemType[] itemTypeArray = new ItemType[10]; add(itemTypeArray, new ItemType(1001,”コーラ”,120)); } … colaという変数をあとで使う必要がないので、 インスタンス化して、そのままメソッドの実引数 として使います。
ここまででできたプログラム コンストラクタを使ったリスト 例題4-4(ItemType.java) main()をコンストラクタを呼び出すことで読みやすくし、追加されているかどうか確認するために、表示メソッドを付け加えたリスト 例題4-4(Example4_4.java)
クラスを利用して プログラムを分割する クラス(オブジェクト)はメソッドも持つことができる クラスは変数のほかに、メソッドも複数まとめてセットで取り扱うことができます。 Exampleクラス main() add() display() …
クラスを利用して プログラムを分割する 5つのメソッドをプログラムの意味を考えて分類するとしたらどうなりますか? Example{ main(); add(); delete(); search(); display(); }
商品種類の管理役 「商品種類リスト」クラスを作り、商品管理のメソッドを移して、仕事を分担しましょう。 Example{ main(); add(); delete(); search(); display(); } Example{ main(); } ItemTypeList{ add(); delete(); search(); display(); 商品種類リスト(ItemTypeList) クラス導入
導入したItemTypeListクラス インスタンス化する オブジェクトの メソッドには staticがいりません 例題4-5 (Example4_5.java) public class ItemTypeList { //商品種類を追加するメソッド public void add(ItemType[] targetArray,ItemType addItemType){ //商品種類が入っていない箱を探す for(int i=0;i<10;i++){ if(targetArray[i] == null){//入っていない targetArray[i] = addItemType;//書き込む break; } //商品種類を表示するメソッド public void display(ItemType[] targetArray){ if(targetArray[i] != null){//商品が入っている System.out.println(targetArray[i].name+"は販売中です"); インスタンス化する オブジェクトの メソッドには staticがいりません
メソッドが main()だけになったExample 例題4-5 (Example4_5.java) public class Example4_5 { public static void main(String[] args) { //自動販売機プログラムの開始を知らせる System.out.println("自動販売機が開始しました。"); //商品種類を保存するための配列を定義する ItemType[] itemTypeArray = new ItemType[10]; //商品種類リストを生成する ItemTypeList itemTypeList = new ItemTypeList(); //商品種類を追加する itemTypeList.add(itemTypeArray,new ItemType(1001,"コーラ")); itemTypeList.add(itemTypeArray,new ItemType(1022,"ソーダ")); itemTypeList.add(itemTypeArray,new ItemType(1033,"お茶")); //商品種類リストを表示する itemTypeList.display(itemTypeArray); } インスタンス化された オブジェクトの メソッドの呼び出し オブジェクト名.メソッド名()
他のオブジェクトの メソッドの呼び出し オブジェクト名.メソッド名(引数) まずItemTypeListクラスのitemTypeListオブジェクト生成 //商品種類リストオブジェクトをインスタンス化する ItemTypeList itemTypeList = new ItemTypeList(); 作ったitemTypeListオブジェクトのaddメソッドを呼ぶ //商品種類を追加する itemTypeList.add(itemTypeArray,new ItemType(1001,"コーラ")); (リスト「Example4_5.java」より)
「クラスとオブジェクト」まとめ クラスはオブジェクトを作るための型である クラスは変数をまとめたり、メソッドをまとめたりすることができる。 クラスからオブジェクトが生成される 雛型がクラスで、実際に値をもつのはオブジェクト クラスは変数をまとめたり、メソッドをまとめたりすることができる。 クラスは変数の型になる