【レポート】クラスについて

【レポート】クラスについて

目的

 オブジェクト指向プログラミングを支える最も根幹的で基本的な技術である「クラスについて」できるようにすること。

内容

 フィールドとして、氏名name、年齢age、所持金moneyをもち、int型の仮引数xをとる「x時間寝る」というsleepメソッド、String型の仮引数sをとる「sを食べる」というeatメソッドを持つHumanクラスを作成する。また、それを試験するTestHumanクラス(mainメソッドを持つ)を作成し、Humanクラスの動作を確認する。また、独自に設計、拡張する。

以下にHumanクラス、TestHumanクラスのソースコードを以下にそれぞれに示す。

Humanクラス

package lesson6;

import java.util.Scanner;

class Human {

        private String name;//氏名

        private int age;//年齢

        private int money;//所持金

        private int watch;//起床時間

        static Scanner stdIn=new Scanner(System.in);

       //コンストラクタ  コンストラクタによって初期化されたので以下のgetName(),getAge(),money()メソッドは引数いらない

        Human(String name, int age, int money){

                this.name=name;

                this.age=age;

                this.money=money;

        }

        //名前を調べる

        String getName(){

                return name;

        }

        //今年の年齢を調べる

        int getAge(){

                return age;

        }

        //所持金を調べる

        int getMoney(){

                return money;

        }

        //寝る時間を調べる

        void sleep(int x){

           System.out.println(x+”時間、毎日寝る”);

        }

        //食べるものを調べる

        void eat(String s){

                System.out.println(s+”を食べた”);

        }

    //生活メソッド

        void seikatu(){

                System.out.println(“1限の授業は9時からです”);

              System.out.println(“朝何時に起きますか?”);

            kisyou();

            hirumesi();

            System.out.println(“15時授業終了!!これからどうしますか?”);

            System.out.println(“買い物をする・・・0, サークル(フットサル)に行く・・・1,友達と遊ぶ・・・2,家に帰る・・・3”);

            houkago();

        }//seikatu()メソッド

        //起床時間を決めるメソッド

        void kisyou(){

         watch=stdIn.nextInt();

            if(watch>=4&&watch<=7){

                 System.out.println(“遅刻せず授業を受けれました”);

            }

            if(watch>=8&&watch<=10){

                 System.out.println(“授業に遅刻しました”);

            }

                if(watch>=11&&watch<12){

                        System.out.println(“1限は受けられませんでした”);

                }

            if(watch>=12){

                 System.out.println(“今さら起きたので今日は学校に行きません”);

                 syuuryou();

            }

            if(watch<=3){

                 System.out.println(“2度寝して授業に出れませんでした”);

                 syuuryou();

            }

            if(watch>=4&&watch<12){     

        System.out.println(“12時になりました!お昼です!何を食べますか?”);

     System.out.println(“パン(200円)・・・0 おにぎり(150円)・・・1 食堂のラーメン(500円)・・・2 手作り弁当(0円)・・・3”);

            }   

        }

        //昼飯を選ぶメソッド

        void hirumesi(){

int eat=stdIn.nextInt();

                        if(eat==0){

                                System.out.println(“何個買いますか?”);

                                int kosuu;

                          do{

                                kosuu=stdIn.nextInt();

                                if(kosuu<=25){

                               money-=200*kosuu;

                               zankin();

                               break;

                                }

                                System.out.println(“所持金が足りなく買えません”);

                                System.out.println(“何個買いますか?”);

                           }while(kosuu>=25);   

                        }

                        if(eat==1){

                                System.out.println(“何個買いますか?”);

                                int kosuu;

                        do{    

                                 kosuu=stdIn.nextInt();                            //int kosuu=stdIn.nextInt();はだめ!!whileのとこに書くとエラーがおこる

                                 if(kosuu<=33){

                                  money-=150*kosuu;

                                  zankin();

                                  break;

                                 }

                          System.out.println(“所持金が足りなく買えません”);

                          System.out.println(“何個買いますか?”);

                         }while(kosuu>=34);       

                        }

                    if(eat==2){

                         money-=500;

                         zankin();

                    }

                    if(eat==3){

                         System.out.println(“母さんありがとう!!”);

                    }

        }//hirumesi()

        //放課後に買い物、サークル、遊ぶのどれかを選ぶメソッド

        void houkago(){

                 int select=stdIn.nextInt();

                    //買い物

                    if(select==0){

                         System.out.println(“何を買いますか?”);

                         System.out.println(“服・・・0,本・・・1,CD・・・2”);

                         kaimono();

                    }//if(select==0)

                    //サークル

                    if(select==1){

                         System.out.println(“楽しかった~!”);

                    }//if(select==1)

                    //友達と遊ぶ

                    if(select==2){

                         System.out.println(“何をして遊びますか?”);

             System.out.println(“ボーリング・・・0,カラオケ・・・1,ダーツ・・・2”);    

                        asobi();

                    }//if(select==2)

                    //家に帰る

                   if(select==3);{

                           syuuryou();      

                   }//if(select==3)

        }//houkago        

        //服、本、CDのどれかを買うかもしれないメソッド

        void kaimono(){

             int kaumono=stdIn.nextInt();

                         if(kaumono==0){

                                 money-=4000;

                                 zankin();

                         }

                         if(kaumono==1){

                                 money-=1200;

                                 zankin();

                         }

                         if(kaumono==2){

                                 money-=1500;

                                 zankin();

                         }

     }//houkago

        //ボーリング、カラオケ、ダーツのどれかを選択するメソッド

        void asobi(){

                int play=stdIn.nextInt();

         if(play==0){

                 money-=1800;

                 zankin();

         }

         if(play==1){

                 money-=700;

                 zankin();

         }

         if(play==2){

                 money-=900;

                 zankin();

         }

        }

        //残金を調べるメソッド

        void zankin(){

            if(money<0){

                   System.out.println(“残念!!足りませんでした”);

                  System.out.println(“友達に”+-money+”円の借金しました。”);

            }

if(money>=0){

                  System.out.println(“所持金の残金は”+money+”円です”);

            }

            if(money==0){

                   syuuryou();

            }

        }

    //1日終わりメソッド

        void syuuryou(){

                        //int useMoney=5000-money;

                        //System.out.println(“今日1日の使ったお金は合計で”+useMoney+”円です”);//+5000-useMoney+と書いてはいけない!!

                     System.out.println(“1日お疲れ様でした”);

            System.out.print(“今日の夕食は”);

           eat(“肉”);

                      System.out.println(“おいしかった!明日も1日がんばろう!!”);

        }      

}//クラス終わり

・TestHumanクラス

package lesson6;

import java.util.Scanner;

class TestHuman{      //public

        public static void main(String[] args){

                //人間の情報  コンストラクタ呼び出し

                Human No1=new Human(“太田隆之”,20,5000);//Stringは”  ”で囲う

                System.out.println(“ある人間の情報”);

                System.out.println(“名前:”+No1.getName());

                System.out.println(“今年の年齢:”+No1.getAge());

                System.out.println(“所持金:”+No1.getMoney());

                No1.sleep(6);

                System.out.println(“上記の人間の1日”);

                No1.seikatu();

        }

}

実行結果

3のプログラムの実行結果の例を以下の図1に示した。

図1 3のプログラムの実行結果の例

考察

 今回のプログラムはクラスというものを使いましたが、クラスというのは、モノ一般に関する性質や機能をまとめたもののことを指す。今回のプログラムのクラスは、class Human {・・・・}のHumanクラスとclass TestHuman{・・・}のTestHumanクラス。そして、この2つクラスの{}の中にそれぞれのクラスの性質や機能を記述していく。このように、記述することをクラスの宣言といいます。クラスの「性質」を表す仕組みはフィールドと呼ばれている。フィールドは、コード上では変数を使って表すことになっている。そしてクラスの「機能」を表す仕組みは、メソッドと呼ばれている。フィールドとメソッドはクラスのメンバと呼ばれている。今回のプログラムのフィールドは、Humanクラスのprivate String name;、private int age;、private int money;、private int watchの4つ。これらにはprivateというものがついているが、privateが付いたフィールドのアクセス性は、非公開アクセスとなり、クラスの外部に対して存在を隠している。つまり、class TestHuman{・・・}からHumanクラスのフィールドにはアクセスすることが出来ない。TestHumanクラスからprivateのついたフィールドにアクセスするには、Humanクラスでprivateのついたフィールドをreturnで返したりするメソッド作って、それらをTestHumanクラスからアクセスすれば直接的ではなく、間接的なので無事エラーは起こらなく無事にアクセス出来る。このように、フィールドを非公開としてデータを隠せば、データの保護性などだけでなく、プログラムの保守性も向上することが期待出来る。なお、privateが指定されていないフィールドはデフォルトアクセス、つまり公開となる。Humanクラスについてこのまま見ていくとHuman(String name, int age, int money){・・・・・}があるが、これはコンストラクタというクラスのインスタンスを初期化すること。インスタンスとは、クラス型の実体のことを呼ぶ。このコンストラクタがいつ呼ばれるかというと、TestHumanクラスにおいて

Human No1=new Human(“太田隆之”,20,5000)が呼ばれた時。Human No1=new Human(“太田隆之”,20,5000)のHuman No1はHumanクラス型の変数だ。Humanはクラスなのでこれをなにかの変数に置き換えないといけない。しかし、このNo1はある人間の情報などの実体ではなく、それぞれを参照するためのクラス型変数であって実体は別に生成する必要がある。配列の場合と同様に、クラスの本体である「実体」の生成は、new演算子を利用する。これがnew Human(“太田隆之”,20,5000)の部分だ。このようにnew演算子によって生成されたクラス型の「実体」をインスタンスと呼びインスタンスを生成することをインスタンス化と呼ぶ。つまり、コンストラクタが呼び出されるのは、インスタンスの生成時だ。このとき呼び出せたコンストラクタは、仮引数name,age,moneyに受け取った値をフィールドname,age,moneyに代入する。この時、プログラムには、this.name=name; this.age=age; this.money=money;と書いてあるが、thisのついているname,age,moneyはフィールドの部分のname,age,moneyのことで、これに代入する何もついてないname,age,moneyは仮引数のname,age,moneyのことである。プログラムを見ると色分けされているので余計分かり易い。もし、thisのついているname,age,moneyのthisの部分をとってしまうと、実行する時プログラムがエラーを起こしてしまう。どちらとも仮比数だと認識されてしまうからだ。もし、コンストラクタが定義されているにも関わらずnew Human(“太田隆之”)、new Human()と書いたりすると、エラーが起きる。

 最初は引数が不足で、次は引数がないからだ。また、今回のプログラムには書いていないが、コンストラクタが定義されてないクラスがある場合はインスタンスを生成する時に、引数を書くことなく()と書く。インスタンス内の個々のフィールドであるインスタンス変数は、メンバアクセス演算子.を利用した“クラス型変数名.フィールド名”によってアクセス出来る。このことは今回のプログラムでは、TestHumanクラスで使用している。また、メソッドにアクセスする時も同じだ。フィールド名をメソッド名に変えるだけ。また、先ほど述べたprivateについて、メソッドを使って間接的にアクセスする方法について、付け足しとしてget(フィールド名、先頭文字を大文字)と記述すると値を取り込む。set(フィールド名、先頭文字を大文字)と記述すると値を代入する。

まとめ

 クラスは、フィールド・コンストラクタ・メソッドなどがカプセル化されたものであり、プログラムでつくられた「回路の設計図」に相当する。個々のクラスは、独立したソースプログラムで実現するべきである。設計図であるクラスから作られた実態が、インスタンスである。インスタンス化(インスタンスの生成)はnew演算子によって行う。

 クラス型変数は、インスタンスを参照する変数である。staticの付かないフィールドは個々のインスタンスに所属することからインスタンス変数と呼ばれる。その値は、インスタンスの状態を表す。フィールドのアクセス性は、原則として非公開(private)とすべきである。クラスの外部に対して存在が隠されるため、データを隠すことができる。コンストラクタは、クラスと同名であり返却値を持たない。コンストラクタの目的は、インスタンスを適切に初期化することであり、コンストラクタを定義しないクラスには、引数を受け取らない形式のデフォルトコンストラクタが自動的に定義される。クラスメンバは、メンバアクセス演算子.を用いた式“クラス型変数名.メンバ名”によってアクセスできる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です