【14章】Javaを学ぼう

今回の記事では、オブジェクトについて詳しく書いていきたいと思います。
私自身のアウトプットの場になりますので、よろしくお願いいたします！

#オブジェクト指向
現実世界の「もの」は情報と振る舞いを持っています。例えば人間であれば、**「名前」や「年齢」といった情報と、「あいさつをする」「歩く」といった振る舞い**を持っています。
プログラムの中のオブジェクトは、現実世界の「もの」を真似たものです。よって、同じように**情報と振る舞い**を持つように作ります。オブジェクト指向で大事なのは**クラスとインスタンス**です。インスタンスというのはオブジェクトの別名です。
そしてクラスはインスタンスの設計図に当たります。インスタンス（オブジェクト）は、クラスという設計図をもとに作られるのです。「名前」「年齢」という情報と「あいさつする」「歩く」という振る舞いを持つ人間のインスタンスを作るのであれば、Personというクラスにそれらの情報と振る舞いを定義します。

##クラスの定義

```java:Main.java
//クラスの定義
class Main {

}
```

##インスタンスの生成
クラスからインスタンスを生成するには**「new クラス名()」**とします。インスタンスは変数に代入して用います。
変数にインスタンスを代入するには**「クラス型 変数名 = new クラス名()」**とします。

```java:Main.java
class Main {
 public static void main(String[] args) {
  Person person = new Person();
//クラス型  変数名
 }
}
```

```java:Person.java
// Personクラスを定義
class Person {

}
```

##インスタンスを複数生成
インスタンスは、1つのクラスから何個でも生成できます。そして同じクラスから作られたインスタンスは、すべて同じ種類の情報と振る舞いを持ちます。
また、インスタンスの情報にあたるものを**「インスタンスフィールド」**、振る舞いにあたるものを**「インスタンスメソッド」**と呼びます。

##インスタンスメソッドの定義
インスタンスの振る舞いは、プログラム上ではメソッドで表現します。このインスタンスのメソッドのことを**インスタンスメソッド**と呼びます。
インスタンスメソッドは**「public 戻り値の型 メソッド名()」**と定義します。
今回は、「あいさつ」という振る舞いをつけることにします。helloというインスタンスメソッドを定義していきます。

```java:Person.java
class Person {
 public void hello() {
  System.out.println("こんにちは");
 }
}
```

インスタンスメソッドはインスタンス（を代入した変数）に対して呼び出します。
**「インスタンス名.メソッド名()」**で呼び出します。

```java:Main.java
class Main {
 public static void main(String[] args) {
  Person person1 = new Person();
  Person person2 = new Person();
  person1.hello();
  person2.hello();
  //インスタンスに対して呼び出す
 }
}
```

次にインスタンスフィールドについてですが、インスタンスフィールドとはインスタンスが持つ情報のことでしたね。
インスタンスフィールドは、情報を格納しておく変数にすぎません。
その変数はクラスの一番上に定義します。**「public データ型 変数名」**というように、変数定義の前にpublicを付けます。
まず「名前」という情報を持たせてあげましょう。

```java:Person.java
class Person {
 public String name;
        //名前を入れる変数を定義
 }
}
```

インスタンスフィールドには、**「インスタンス名.フィールド名」**というように、インスタンスに対してドット（.）を用いてアクセスします。

```java:Main.java
class Main {
 public static void main(String[] args) {
  Person person1 = new Person();
  person1.name = "Nakamura";
  System.out.println(person1.name);

  Person person2 = new Person();
  person2.name = "Yamada";
  System.out.println(person2.name);
 }
}
```

出力結果↓

```java:コンソール
Nakamura
Yamada
```

##クラスの中でインスタンスを扱う
インスタンスフィールドnameの値を用いて、helloメソッドで「こんにちは、私は◯◯です」と、自分の名前とともに出力するようにしてみます。helloメソッドの中でnameフィールドの値を使うことができればいいはずです。
メソッド内でインスタンスフィールドにアクセスするためには**「this」**という特殊な変数を用います。thisはメソッドが呼ばれた時に、そのメソッドを呼び出しているインスタンスに置き換えられます。

```java:Main.java
class Main {
 public static void main(String[] args) {
  Person person = new Person();
  person.name = "Nakamura";
  person.hello();
 }
}
```

```java:Person.java
class Person {
 public String name;
 public void hello() {
  System.out.println("こんにちは、私は" + this.name + "です");
                                    //"Nakamura"
 }
}
```

出力結果↓

```java:コンソール
こんにちは、私はNakamuraです
```

ここまではインスタンスを生成してから、nameフィールドの値をセットしてきましたが、これはインスタンスフィールドが増えると面倒になります。インスタンスフィールドへの値のセットを楽にする方法があります。

##コンストラクタ
クラスには、**コンストラクタ**というものがあります。
コンストラクタとは、newを使ってインスタンスを生成した後に自動で呼び出される特別なメソッドです。
また、定義方法が決まっています。

```java:コンストラクタの定義
class クラス名 {
 クラス名() {
  //インスタンスの生成時に行いたい処理
 }
}
```

**①コンストラクタ名はクラス名と同じにする、②戻り値を書いてはいけない（voidも書かない）**という2つの決まりを守りましょう。
それではコンストラクタを用いて、インスタンスフィールドへの値のセットの面倒さを解決していきます。
newでインスタンスを作る際、「new クラス名()」の()には引数を渡すことができます。そしてその引数は直後に呼び出されるコンストラクタに受け渡されます。

```java:Main.java
class Main {
 public static void main(String[] args) {
  Person person = new Person("Nakamura");
  //person.name = "Nakamura";
  System.out.println(person.name);
 }
}
```

```java:Person.java
class Person {
 public String name;
 Person(String name) {  //"Nakamura"
  this.name = name;
 }
}
```

出力結果↓

```java:コンソール
Nakamura
```

インスタンスを生成する際に、インスタンスフィールドにセットしたい値を引数に渡し、コンストラクタでセットするようにしてあげましょう。
コンストラクタでも、thisを用いてインスタンスを利用することができます。

今回はオブジェクトを中心に説明をさせていただきました。
よろしければ次章もご覧になってください！次章では今回勉強した内容を活用し、自己紹介プログラムを作ってみたいと思います。
最後までご覧いただきまして、ありがとうございました！