【19章】Javaを学ぼう

前章（【18章】Javaを学ぼう）では自己紹介プログラムを完成させました！
今回は「オブジェクト指向」についてさらに基礎を定着させるため、もう一つプログラムを実装していきたいと思います！
自身のアウトプットの場となりますので、よろしく願いいたします！

まず、「自転車」と「車」という2種類のオブジェクトを用いてプログラムを組み立てます。

##Bicycleクラスの作成
・Bicycleクラスの定義
・Bicycleクラスにインスタンスフィールドnameを定義（private）
・インスタンスを生成し、コンソールにnameの値を出力

```java:Bicycle.java
class Bicycle {
 private String name; 

 Bicycle(String name) {
  this.name = name;
 }

 public String getName() {
  return this.name;
 }
}
```

```java:Main.java
class Main {
 public static void main(String[] args) {
  Bicycle bicycle = new Bicycle("ジオス");
  System.out.print("【自転車の情報】");
  System.out.println("名前：" + bicycle.getName());                     
 }
}
```

##Bicycleクラスに色を追加
・Bicycleクラスにインスタンスフィールドcolorを追加（private）
・printDataメソッドを定義して、コンソールにnameとcolorの値を出力

```java:Bicycle.java
class Bicycle {
 private String name; 
 private String color;

 Bicycle(String name, String color) {
  this.name = name;
  this.color = color;
 }

 public String getName() {
  return this.name;
 }

 public String getColor() {
  return this.color;
 }

 public void printData() {
  System.out.println("名前：" + this.name);
  System.out.println("色：" + this.color);
 }
}
```

```java:Main.java
class Main {
 public static void main(String[] args) {
  Bicycle bicycle = new Bicycle("ジオス", "青");
  System.out.print("【自転車の情報】");
  bicycle.printData();                     
 }
}
```

##Bicycleクラスに走行距離を追加
・インスタンスフィールドdistanceを追加（private）
・distanceフィールドの初期値は0
・コンソールに、name, color, distanceの値を出力

```java:Bicycle.java
class Bicycle {
 private String name; 
 private String color;
 private int distance = 0;

 Bicycle(String name, String color) {
  this.name = name;
  this.color = color;
 }

 public String getName() {
  return this.name;
 }

 public String getColor() {
  return this.color;
 }

 public void printData() {
  System.out.println("名前：" + this.name);
  System.out.println("色：" + this.color);
  System.out.println("走行距離：" + this.distance + "km");
 }
}
```

```java:Main.java
class Main {
 public static void main(String[] args) {
  Bicycle bicycle = new Bicycle("ジオス", "青");
  System.out.print("【自転車の情報】");
  bicycle.printData();                     
 }
}
```

##「走る」機能追加
・インスタンスメソッドrunを定義
・runメソッドは、引数にint型の値（走る距離）を受け取る
・引数で受け取った値を用いて、コンソールに「◯◯km走ります」と出力
・引数で受け取った値を、distanceフィールドに加算する

```java:Bicycle.java
class Bicycle {
 private String name; 
 private String color;
 private int distance = 0;

 Bicycle(String name, String color) {
  this.name = name;
  this.color = color;
 }

 public String getName() {
  return this.name;
 }

 public String getColor() {
  return this.color;
 }

 public void printData() {
  System.out.println("名前：" + this.name);
  System.out.println("色：" + this.color);
  System.out.println("走行距離：" + this.distance + "km");
 }
 public void run(int distance) {
  System.out.println(distance + "km走ります");
  this.distance += distance;
  System.out.println("走行距離：" + this.distance + "km");
 }
}
```
さらにScannerを使って、走る距離を受け取れるようにします。

```java:Main.java
import java.util.Scanner;
class Main {
 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  Bicycle bicycle = new Bicycle("ジオス", "青");
  System.out.print("【自転車の情報】");
  bicycle.printData(); 
  System.out.println("-----------------");
  System.out.print("走る距離を入力してください：");
  int bicycleDistance = scanner.nextInt();
  bicycle.run(bicycleDistance);                    
 }
}
```

##Carクラスの作成
ここまではBicycleクラスの作成をしてきました。同じようにCarクラスを作成します。
Bicycleクラスと同じフィールド、同じメソッドを持つようにします。

```java:Car.java
import java.util.Scanner;
class Car {
 private String name;
 private String color;
 private int distance = 0;
 
 Car(String name, String color) {
  this.name = name;
  this.color = color;
 }

 public String getName() {
  return this.name;
 }

 public String getColor() {
  return this.color;
 }
  
 public void printData() {
  System.out.println("名前：" + this.name);
  System.out.println("色：" + this.color);
  System.out.println("走行距離：" + this.distance + "km");
 }
 public void run(int distance) {
  System.out.println(distance + "km走ります");
  this.distance += distance;
  System.out.println("走行距離：" + this.distance + "km");
 }
}
```

```java:Main.java
import java.util.Scanner;
class Main {
 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  Bicycle bicycle = new Bicycle("ジオス", "青");
  System.out.print("【自転車の情報】");
  bicycle.printData(); 
  System.out.println("-----------------");
  System.out.print("走る距離を入力してください：");
  int bicycleDistance = scanner.nextInt();
  bicycle.run(bicycleDistance);   
  System.out.println("=================");
  Car car = new Car("フェラーリ", "赤");
  System.out.println("【車の情報】");
  car.printData();
  System.out.println("-----------------");
  System.out.print("走る距離を入力してください:");
  int carDistance = scanner.nextInt();
  car.run(carDistance);                 
 }
}
```

##Carクラスにガソリン機能追加
車にはガソリンが必要なので、「ガソリン量」という情報を持たせましょう。
・インスタンスフィールドfuelを追加（private）
・fuelフィールドの初期値は100（100Lが満タンだとします）
・コンソールに、fuelの値を出力

```java:Car.java
import java.util.Scanner;
class Car {
 private String name;
 private String color;
 private int distance = 0;
 private int fuel = 100;
 
 Car(String name, String color) {
  this.name = name;
  this.color = color;
 }

 public String getName() {
  return this.name;
 }

 public String getColor() {
  return this.color;
 }
  
 public void printData() {
  System.out.println("名前：" + this.name);
  System.out.println("色：" + this.color);
  System.out.println("走行距離：" + this.distance + "km");
  System.out.println("ガソリン量：" + this.fuel + "L");
 }
 public void run(int distance) {
  System.out.println(distance + "km走ります");
  this.distance += distance;
  System.out.println("走行距離：" + this.distance + "km");
 }
}
```

##Carクラスのrunメソッドの改良
Carクラスのインスタンスが走れば、fuelフィールドの値が減るようにしましょう。今回は1km走れば、ガソリンを1L消費するという条件にします。条件分岐を行い、走る距離がガソリンの残量を超えていた場合、走行できないようにします。

```java:Car.java
import java.util.Scanner;
class Car {
 private String name;
 private String color;
 private int distance = 0;
 private int fuel = 100;
 
 Car(String name, String color) {
  this.name = name;
  this.color = color;
 }

 public String getName() {
  return this.name;
 }

 public String getColor() {
  return this.color;
 }
  
 public void printData() {
  System.out.println("名前：" + this.name);
  System.out.println("色：" + this.color);
  System.out.println("走行距離：" + this.distance + "km");
  System.out.println("ガソリン量：" + this.fuel + "L");
 }
 public void run(int distance) {
  System.out.println(distance + "km走ります");
  if (distance <= this.fuel) {
    this.distance += distance;
    this.fuel -= distance;
  } else {
    System.out.println("ガソリンが足りません");
  }
  System.out.println("走行距離：" + this.distance + "km");
  System.out.println("ガソリン量：" + this.fuel + "L");
 }
}
```

##Carクラスに車に「給油」機能追加
・Carクラスにchargeメソッドを定義
・chargeメソッドは、引数にint型の値（給油する量）を受け取る
・引数の値を用いて、「◯◯L給油します」と出力
・chargeメソッドの中で、条件分岐を行う

```java:Car.java
import java.util.Scanner;
class Car {
 private String name;
 private String color;
 private int distance = 0;
 private int fuel = 100;
 
 Car(String name, String color) {
  this.name = name;
  this.color = color;
 }

 public String getName() {
  return this.name;
 }

 public String getColor() {
  return this.color;
 }
  
 public void printData() {
  System.out.println("名前：" + this.name);
  System.out.println("色：" + this.color);
  System.out.println("走行距離：" + this.distance + "km");
  System.out.println("ガソリン量：" + this.fuel + "L");
 }
 public void run(int distance) {
  System.out.println(distance + "km走ります");
  if (distance <= this.fuel) {
    this.distance += distance;
    this.fuel -= distance;
  } else {
    System.out.println("ガソリンが足りません");
  }
  System.out.println("走行距離：" + this.distance + "km");
  System.out.println("ガソリン量：" + this.fuel + "L");
 }

 public void charge(int litre) {
  System.out.println(litre + "L給油します");
  if (litre <= 0) {
    System.out.println("給油できません");
  } else if (litre + this.fuel >= 100) {
    System.out.println("満タンまで給油します");
    this.fuel = 100;
  } else {
    this.fuel += litre;
  }
  System.out.println("ガソリン量：" + this.fuel + "L");
 }
}
```

```java:Main.java
import java.util.Scanner;
class Main {
 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  Bicycle bicycle = new Bicycle("ジオス", "青");
  System.out.print("【自転車の情報】");
  bicycle.printData(); 
  System.out.println("-----------------");
  System.out.print("走る距離を入力してください：");
  int bicycleDistance = scanner.nextInt();
  bicycle.run(bicycleDistance);   
  System.out.println("=================");
  Car car = new Car("フェラーリ", "赤");
  System.out.println("【車の情報】");
  car.printData();
  System.out.println("-----------------");
  System.out.print("走る距離を入力してください:");
  int carDistance = scanner.nextInt();
  car.run(carDistance);    
  System.out.println("-----------------");
  System.out.print("給油する量を入力してください：");
  int litre = scanner.nextInt();
  car.charge(litre);             
 }
}
```

これでひとまずプログラムが完成になります。次章では重要な「オブジェクト指向」である継承について学び、さらに今回作成したプログラムを改良していきたいと思います！
最後までご覧いただきまして、ありがとうございました！