iT-18-[ほっと一息、Java☕︎]

復習

・オブジェクト指向

class NonObject{
  public static void main(String[] args){
    //データの代入
    int[] score = {80, 100, 75};
    String[] name = {"菅原", "村山", "寺島"};

    //データの表示
    for(int i = 0; i < score.length; i++) {
      System.out.println(name[i] + "さん:" + score[i] + "点");
    }
  }
}

というコード。

1回作ったコードは、更新(変更)することがほとんどである。
例えば、この要素数の中で、生徒が一人増えたとした。
もしくは、教科の数を増やしたいと考える。

class NonObject{
  public static void main(String[] args){
    //データの代入
    int[] score1 = {80, 100, 75, 90};
    int[] score2 = {90, 80, 85, 70};

    String[] name = {"菅原", "村山", "寺島"};
    String[] name = {"数学", "英語"};

    //データの表示
    for(int i = 0; i < score.length; i++) {
      System.out.println(name[i] + "さん:" + score[i] + "点");
    }
  }
}

いちいち面倒だ。また、誰の、何の得点が何点かがわからない・・・。

人ごとの点数がもう少しまとめて、管理しやすくできないかを考える必要があると考える。

Javaには、実行用のクラスと、設計図クラスの二つがある。

クラス(設計図)
属性→何のデータを持っているのか。
(名前、教科、点数など)
操作→何の処理ができるか。
(点数を表示する)

→これによって、名前(菅原)英語(90)国語(80)
名前(佐藤)英語(50)国語(60)などというのをそのまま使える。

このような、クラスから作られる実体(モノ)を、object(オブジェクト)と呼ぶ。
このオブジェクトを中心にプログラムを作っていくことを、オブジェクト指向という。

・メリット

開発効率、保守性、メモリ効率、システム化など!!

クラス(設計図)
属性→何のデータを持っているのか。→  プログラムの世界では、変数
(名前、教科、点数など)
操作→何の処理ができるか。→  プログラムの世界では、メソッド
(点数を表示する)
これらの言い方がごっちゃにならないようにする。

・変数の定義

データ型 変数名;

class Student{
  //メンバ変数(属性)
  String name;
  int engScore;
  int mathScore;
以下はその下に続く

・メソッドの定義

戻り値の型 メソッド名(引数リスト){
(処理)
}

メソッドは、呼び出す側と、呼び出される側がある。

  //メソッド(操作)
  void display(){
    System.out.println(name + "さん");
    System.out.println("英語" + engScore + "点・数学" + mathScore + "点");
  }
  void setScore(int eng, int math){
    engScore = eng;
    mathScore = math;
  }  
  double getAvg(){
    double avg = (engScore + mathScore) / 2.0;
    return avg;
  }
}

引数・・呼び出し元から受け取る値のこと。
戻り値・・メソッドの処理の後に、呼び出しもとに返す値。returnで指定することができる。
また、何も返さない場合は、voidを記述する。

  void display(){
    System.out.println(name + "さん");
    System.out.println("英語" + engScore + "点・数学" + mathScore + "点");
  }

↑は、引数がないが、()は書いておくことに注意しておく。

  //データ型 変数名
  void setScore(int eng, int math){
    engScore = eng;
    mathScore = math;
  }  

↑は、引数がある。戻り値がない。

  double getAvg(){
    double avg = (engScore + mathScore) / 2.0;
    return avg;
  }
}

↑は、引数なし、戻り値ありのパターンある。

また、引数の中で定義した有効範囲は、そのブロックの中でしか使えないので、注意をする必要がある。

・オブジェクトの使い方

①オブジェクトを生成すること
②変数・メソッドを利用すること

①オブジェクトを生成すること
クラス名 オブジェクト名 = new クラス名();
Student stul = new Student( );

new キーを使うと、メモリ上に新しく領域が確保される。配列でも出ました。

デフォルト初期値も入る。このように、プログラムにおいて、オブジェクトを作ることを、インスタンス化という。

②変数・メソッドを利用すること
オブジェクト名.変数名
オブジェクト名.メソッド名(引数)
stul.name = "菅原";
stul.setScore(80,90);

設計図

class Student{
  //メンバ変数(属性)
  String name;
  int engScore;
  int mathScore;
 
   //メソッド(操作)
  void display(){
    System.out.println(name + "さん");
    System.out.println("英語" + engScore + "点・数学" + mathScore + "点");
  }
  void setScore(int eng, int math){
    engScore = eng;
    mathScore = math;
  }  
  double getAvg(){
    double avg = (engScore + mathScore) / 2.0;
    return avg;
  }
}

設計図をもとに、StuSampleクラスを動かしていく。

class StuSample{
  public static void main(String[] args){
    Student stu1 = new Student();

    stu1.name = "菅原";
    stu1.setScore(90, 80);

    stu1.display();    
    System.out.println("平均" + stu1.getAvg() + "点");
  }
}

前回の演習問題

ささ、今回は演習問題をやっていくぞ〜〜!!


・問題


・自動車を管理する設計図のクラスとして、Carクラスを定義する。Carクラスの持つメンバ変数とメソッドは以下の通りである。

さて、このCarクラスを利用する実行用クラスとして、DriveCarクラスを定義する。DriveCar.javaのコメントに合わせてコードを追加し、プログラムを完成させなさい。

class DriveCar{
  public static void main(String[] args){
    //Carクラスのオブジェクトc1を生成

    //c1のナンバーを2525に設定

    //c1の速度を30に設定

    //c1のナンバー、速度を表示

n//c1の速度を0に設定

    //c1のナンバー、速度を表示

  }
}

・自分の思考


まず、

class DriveCar{
  public static void main(String[] args){
    //Carクラスのオブジェクトc1を生成

    //c1のナンバーを2525に設定

    //c1の速度を30に設定

    //c1のナンバー、速度を表示

    //c1の速度を0に設定

    //c1のナンバー、速度を表示

  }
}

上から

    //Carクラスのオブジェクトc1を生成
    Car c1 = new Car();

△ Car();であっているか微妙・・・。

    //c1のナンバーを2525に設定
    c1.no = 2525;

これはメソッドを利用している。

    //c1の速度を30に設定
        c1.speed = 30;

ナンバーと同じこと。(メソッドの利用)

    //c1のナンバー、速度を表示
        System.out.println("ナンバー:" + c1.no  + "速度:" + c1.speed );

△ no, speedだけでいいのか不安。

    //c1の速度を0に設定
        c1.stop();

△ これはそもそも何をやっているかわからんけど、voidなくてOK?

    //c1のナンバー、速度を表示
        System.out.println("ナンバー:" + c1.no  + "速度:" + c1.speed );

さっきと同じ書き方でも、その前に速度を0に設定しているので表示は異なるはず。

ということで、

class DriveCar{
  public static void main(String[] args){
    //Carクラスのオブジェクトc1を生成
    Car c1 = new Car();

    //c1のナンバーを2525に設定
    c1.no = 2525;
   
       //c1の速度を30に設定
        c1.speed = 30;

    //c1のナンバー、速度を表示
        System.out.println("ナンバー:" + c1.no  + "速度:" + c1.speed );

    //c1の速度を0に設定
        c1.stop();

    //c1のナンバー、速度を表示
        System.out.println("ナンバー:" + c1.no  + "速度:" + c1.speed );

  }
}

どうでしょうかね。


・答え合わせ


クラスには、実行用クラスと、設計図クラスがある。

メンバ変数の宣言は、
データ型 変数名

変数名は両方とも与えられているので、そのまま書くだけ。
戻り値、メソッド名、引数{

このように、設計図クラスは作ることができる。

//設計図クラス
class Car{
  //メンバ変数
  int no;
  int speed;

  //メソッド
  void setNo(int n){
    no = n;
  }
  void run(int s){
    speed = s;
  }
  void stop(){
    speed = 0;
  }
  void display(){
    System.out.println("ナンバー" + no + "の速度は" + speed + "です");
  }
}

よって、これに従って、実行用クラスも変わることに注意するべきだった。

作りかた→設計図クラス→実行用クラス/だった!!!
くっそ〜〜

従って、

//実行用クラス
class DriveCar{
  public static void main(String[] args){
    //Carクラスのオブジェクトc1を生成
    Car c1 = new Car();

    //c1のナンバーを2525に設定
    c1.setNo(2525);

    //c1の速度を30に設定
    c1.run(30);

    //c1のナンバー、速度を表示
    c1.display();

    //c1の速度を0に設定
    c1.stop();

    //c1のナンバー、速度を表示
    c1.display();
  }
}

こんな簡単なのか〜〜。。いいね!

勉強

・オーバーロードとは

クラスないに同じ名前で引数の型や数が違うメソッドを定義することをオーバーロードという。

呼び出すメソッドは、名前と因数の組み合わせで決めている。
これができないと、コンパイルエラーになる。

class Student {
  void setData(String n){
            (中略)
    }
  void setData(String n, int e, int m){
            (中略)
    }            
main(~){
  Student syu = new Student();
  stu.setData("菅原");
  stu.setData("菅原", 80, 90);
}

・メリット

・プログラム自体がわかりやすくなる。
→同じデータを設定するためのメソッドなので、setDataという同じ名前にした方が、同じような処理をしているのが見た目でわかる。
・名前をつけるのがラクになる
→同じ名前をつけても使えるから。
・メソッド名が変わらないので、とても使いやすい。例えば、printlnメソッドもクラスで使われているので、オーバーロードを使うとすごく便利になる。

・オーバーロードの例

class Student2{
  String name;
  int engScore;
  int mathScore;

  void setData(String n){
    name = n;
  }
  void setData(String n, int e, int m){
    name = n;
    engScore = e;
    mathScore = m;
  }
  void setScore(int e, int m){
    engScore = e;
    mathScore = m;
  }
  void display(){
    System.out.println(name + "さん");
    System.out.println("英語" + engScore + "点・数学" + mathScore + "点");
  }
}
class StuSample2{
  public static void main(String[] args){
    Student2 stu1 = new Student2();
    Student2 stu2 = new Student2();

    stu1.setData("菅原");
    stu1.setScore(90, 80);
    stu1.display();

    stu2.setData("村山", 75, 100);
    stu2.display();
  }
}

つまり、

メソッドを呼び出す時には、メソッド名だけでなく、(同じメソッドが使われているので)その引数でどのメソッドを作るのかを決めている。

・コンストラクタ

construction(組み立てる)
→オブジェクトの初期化のために使われる特殊なメソッドを、
コンストラクトという。

① 名前がクラス名と同じ
②  戻り値を持たない
③ newクラス名(コンストラクタへの引数

コンストラクタを定義していない場合は、自動でデフォルトコンストラクタ(引数&処理なし)が生成される。
例 Student(){}

class Student{
  Student(String n){
}

コンストラクタもメソッドの一つなので、オーバーロードできる。

class Student {
  void setData(String n){
            (中略)
    }
  void setData(String n, int e, int m){
            (中略)
    }            
main(~){
  Student syu = new Student("管原");
  Student syu = new Student("村山", 75, 100);
}

最初、コンストラクタを定義していなかったので、コンパイル時に自動でデフォルトコンストラクタを生成されていた。なので、自分で設定いしてもいいということだ。

生成と同時に値を入れられるので、安全という訳だ。

・staticとは

作ったインスタンスの個数を知る方法は?

class Student{
  int counter = 0;
  Student(){
    counter ++;
  }
}

インスタンス内の変数では、むり。
前インスタンスが共通して使える変数が必要!

・static変数

class Student{
  static int counter = 0;

  Student(){
    counter ++;
  }
  
  static void display(){
    System.out.println(counter + "人です");

}

全インスタンス変数が使えるメンバ変数やメソッドを定義する時には、staticを指定する。
オブジェクトを生成していなくても利用できる。
利用方法
クラス名.変数[メソッド]名と書く。

・全部のインスタンスから共通して使う変数やメソッドを作りたいときに使う。

サンプルコード

class Student4{
  String name;
  static int counter = 0;

  Student4(String n){
    name = n;
    counter++;
    System.out.println(name + "さんをインスタンス化しました");
  }
  static void display(){
    System.out.println(counter + "人です");
  }
}
class StuSample4{
  public static void main(String[] args){
    Student4.display();

    Student4 stu1 = new Student4("菅原");
    Student4.display();

    Student4 stu2 = new Student4("村山");
    Student4.display();
  }
}

ここまで!!

少しずつですが、投稿をしております。 noteで誰かのためになる記事を書いています。 よろしくおねがいします。