Hello Worldからの復習 ～オブジェクトの使い方編～



##### お品書き
+ オブジェクトの使い方って？
+ Sample

----


◆オブジェクトの使い方って？
-

設計図クラスを基にオブジェクトを作って利用するには大きく2つのステップを踏む
まず、オブジェクトを生成し、次にオブジェクトの持っている**変数**や**メソッド**を利用する

①生成
-

```java:java
クラス名 オブジェクト名 = new クラス名();
Student stu1 = new Student();
```
前回の設計図編を参考

https://qiita.com/tianshandafu894/items/0655cdf0849f363469e7

上記のコードでnewした時、メモリ上に新しく領域が確保され、3つの変数の領域と3つのメソッドの情報が含まれるイメージの図↓
```mermaid
classDiagram
  Student --|> newしたメモリ領域
  class Student{
    +name　:String
    +engScore　:int
    +mathScore  :int
    +display():void
    +setScore(int,int):void
    +getAvg():double
  }
  class newしたメモリ領域{
    +name[]
    +engScore[] mathScore[]
    +display() setScore(...)
    getAvg()
  }
```

`stu1`にはいる値は配列の時と同様で参照値のため、メモリ上にできたアドレス値が変数に代入される。
```mermaid
classDiagram
  Student --|> newしたメモリ領域_A001
  stu1-->newしたメモリ領域_A001
  class Student{
    +name　:String
    +engScore　:int
    +mathScore  :int
    +display():void
    +setScore(int,int):void
    +getAvg():double
  }
  class newしたメモリ領域_A001{
    +name[]
    +engScore[] mathScore[]
    +display() setScore(...)
    getAvg()
  }
  class stu1{
  A001
  }
```

みたいな。

配列をnewで作ると入れ物の中には**デフォルト初期値**が入った。
例えば、基本データ型の数値は0、char型は空文字(' ')、真偽値はfalseで、参照値は何も入らない。
上記のメモリ領域A001の図で言えば、nameには何も入らず、2つのスコアの値は0が入った状態でメモリ上に領域が確保される。

プログラムにおいてオブジェクトを作ることを**インスタンス化**という。

```mermaid
classDiagram
  Student --|> "インスタンス化"newしたメモリ領域_A001
  stu1-->newしたメモリ領域_A001
  class Student{
    +name　:String
    +engScore　:int
    +mathScore  :int
    +display():void
    +setScore(int,int):void
    +getAvg():double
  }
  class newしたメモリ領域_A001{
    +name[]
    +engScore[] mathScore[]
    +display() setScore(...)
    getAvg()
  }
  class stu1{
  A001
  }
```

プログラムの中で実際にできたオブジェクトを**インスタンス**と呼んだりもする。


②変数・メソッドを利用
-

```java:java
オブジェクト名.変数名
オブジェクト名 メソッド名(引数)
stu1.name = "大輔";
stu1.setScore(80,90);
```

stu1の先にあるnameに大輔という文字列を代入してくださいという意味。

```mermaid
classDiagram
  Student --|> "インスタンス化"newしたメモリ領域_A001
  stu1-->newしたメモリ領域_A001
   newしたメモリ領域_A001-->"参照型だから別領域にできた文字列を参照"大輔

  class Student{
    +name　:String
    +engScore　:int
    +mathScore  :int
    +display():void
    +setScore(int,int):void
    +getAvg():double
  }
  class newしたメモリ領域_A001{
    +name[]
    +engScore[] mathScore[]
    +display() setScore(...)
    getAvg()
  }
  class stu1{
  A001
  }
```

◆Sample
-

```java:java
class StuSample{
	public static void main(String[] args){
		Student stu1 = new Student(); //インスタンス化
		
		stu1.name = "大輔";
		stu1.setScore(90,80); //ここを呼び出すと設計図クラスのsetScore()の処理が実行される
		
		stu1.display();
		System.out.println("平均" + stu1.getAvg() + "点"); //getAvgの値にStudentクラスのreturn avgの値が返ってくる
	}
}
```

前回の設計図編のSample参照


```java:java
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){ //mainクラスの90,80が[0],[1]で格納される
  engScore = eng;
  mathScore = math;
}
double getAvg(){
  double avg = (engScore + mathScore) / 2.0;
  return avg; //計算結果の85.0がreturnで呼び出し元に戻っていく
  }
}
```

mainメソッドが含まれているjavaファイルをコンパイル＆実行

```cmd:cmd
C:\Java\1>javac StuSample.java

C:\Java\1>java StuSample
大輔さん
英語90点・数学80点
平均85.0点
```
名前と各教科の点数を設計図クラスのdisplayメソッドで出力し、メインメソッドで平均点を出力できました。