【Java開発】第5回 クラス

#初めに

皆さん。こんにちは！

DreamHanksの254cmです。

今回はクラスについて説明していきます。

Java記事のまとめは[こちら](https://qiita.com/DreamHanks/items/6b1996e1f8ed66bbd456)です。

前回の記事は[【Java開発】第4回 ループ](https://qiita.com/DreamHanks/items/772aa8d63a748a70e33c)です。

##クラス

###・クラスとは？

```java
アクセス制御子 class クラス名 {			
    フィールド			
    メソッド			
}			
```

クラスは現実の私物の概念をデータとして扱い、そのデータをプログラムで作成したものです。

クラスはフィールドとメソッドで構成され、フィールドはデータの情報、メソッドはデータの動作を表しています。

###・サンプル
猫の概念をクラスとして考えると猫の情報は「色」、「性別」、「種類」など、猫の動作は鳴き、動くなどで定義することができます。

上記の情報をJavaで作成してみると

```java
public class Cat {			
	String color; // 猫の色		
	String gender; // 猫の性別		
	String species // 猫の種類		
			
	public void cry () {		//猫の鳴き
		System.out,println("meow");	
	}		
	public void move() {                //猫の動き		
		System.out.println("run");	
	}	
}			
```
になります。

##オブジェクト

###・オブジェクトとは？

クラスが私物の概念をプログラムで作成したものなら、オブジェクトはその概念を具体化させたものです。

「**猫は様々な毛色が存在し、性別は雌雄で別れており、種類は多様だ**」という概念がクラスなら、

「ムギ」という猫はオブジェクトになります。

上記の情報をJavaで作成してみると

```java
public class Cat {												
	String color; // 猫の色											
	String gender; // 猫の性別											
	String species // 猫の種類											
												
	public void cry () {		//猫の鳴き									
		System.out.println("mewo");						
	}											
	public void move() {                //猫の動き											
		System.out.println("run");										
	}											
}												
												
public class ExcuteMain {												
	public static void main(String[] args) {											
		Cat mugi;	//mugiという猫を具体化						
	}											
}												
```

になります。

##インスタンス

###・インスタンスとは？

クラスを具体化してオブジェクトを作りましたが、そのままでは個別の情報を持てないです。

Javaでオブジェクトが個別の情報を格納するメモリを割り当てる動作を「**インスタンス化**」と呼びます。

上記のサンプルを補足して「ムギ」ちゃんの情報を入力してみましょう。

```java
public class Cat {												
	String color; // 猫の色											
	String gender; // 猫の性別											
	String species // 猫の種類											
												
	public void cry () {		//猫の鳴き									
		System.out.println("mewo");						
	}											
	public void move() {                //猫の動き											
		System.out.println("run");	
	}																				
}												
												
public class ExcuteMain {												
	public static void main(String[] args) {											
		Cat mugi = new Cat(); // mugiをインスタンス化
		mugi.color = "grey"; // mugiの毛色をグレーに定義
		mugi.gender = "female"; //mugiの性別を雌に定義
		mugi.species = "RussianBlue"; //mugiの種類をロシアンブルーに定義				
	}											
}												
```

Catクラスのオブジェクト「ムギ」をインスタンス化して毛色、性別、種類を定義しました。

##クラスの構成要素

###フィールド

フィールドはクラスの情報および状態であり、クラスに含まれている変数になります。

・サンプル

```java
public class Cat {												
	String color; // フィールド									
	String gender; // フィールド											
	String species // フィールド											
												
	public void cry () {		//猫の鳴き									
		System.out.println("mewo");						
	}											
	public void move() {                //猫の動き											
		System.out.println("run");										
	}											
}																																		
```

###メソッド

```java		
アクセス制御子 戻り値の型 メソッド名(引数){		
    メソッドの処理		
}
```

 メソッドはクラスが定義している概念の動作を意味し、メソッドは特定の作業を行うための処理をひとまとめたものです。

・アクセス制御子：変数やメソッド・クラスの接続可能範囲を指定するものです。

・引数；引数はメソッドが作業を行うことに必要な入力値を保存するものです。

・戻り値の型：メソッドの処理して返還する値のタイプです。

※戻り値はメソッドが行った作業の結果です。

・サンプル

計算機をメソッドとして考えてみると

計算したい二つの数と演算子は引数であり、二つの数を計算する過程はメソッドの処理になります。

その計算の結果が戻り値になります。

上記の情報をJavaで作成してみます。

```java
public class ExcuteClass {

	public static void main(String[] args) {
		Calculator cal = new Calculator();
		System.out.println(cal.calculate(5, 6, "+")); // 引数num1に5、num2に6、operatorに+を入力
	}

}

class Calculator {
	
	public int calculate(int num1, int num2, String operator) { // 引数
		switch (operator) {
		case "+":
			return num1 + num2;     //戻り値
			
		case "-":
			return num1 - num2;     //戻り値
			
		case "*":
			return num1 * num2;     //戻り値
			
		case "/":
			return num1 / num2;     //戻り値
		
		default:
			return 0;     //戻り値
		}
	}
}
```

※returnはjavaの予約語であり、メソッドを終了させて右に書かれている値または変数を返します。


####メソッドを使うメリット

**①コードが読みやすくなる**

同じ作業を行うためのメソッドが集まっているので、読みやすいです。						
							
**②変更が容易になる**

任意の動作を行うために動作が行われる個所にいちいち処理を作成すると						

動作の内容の変更があった場合、動作が行われる個所全部を修正しなければなりませんが、						

メソッドで動作の処理をまとめると動作の変更を反映するためにメソッドだけ変更すればいいので						

管理しやすいです。
	
**③処理を再利用できる**

いくつかの処理もメソッドでまとめるとメソッドを呼び出すことだけで						

使えるので、処理の再利用がしやすいです。

・サンプル

```java
public class ExcuteClass {

	public static void main(String[] args) {
		Cat mugi = new Cat();
		mugi.name = "ムギ";
		mugi.age = 3;
		mugi.species = "ロシアンブルー";
		mugi.color = "grey";
		
		System.out.println("この猫の名前は"+ mugi.name + "です。");
		System.out.println(mugi.name + "ちゃんの毛色は"+mugi.color+"です。");
		System.out.println(mugi.name + "ちゃんの種類は"+mugi.species+"です。");
		System.out.println(mugi.name + "ちゃんは"+mugi.age+" 歳です。");
		
		mugi.name = "レオ";
		mugi.age = 5;

		System.out.println("この猫の名前は"+ mugi.name + "です。");
		System.out.println(mugi.name + "ちゃんの毛色は"+mugi.color+"です。");
		System.out.println(mugi.name + "ちゃんの種類は"+mugi.species+"です。");
		System.out.println(mugi.name + "ちゃんは"+mugi.age+" 歳です。");
	}

}

class Cat {
	int age;
	String color;
	String species;
	String name;
	
}																															
```
上記のサンプルではメソッドを使わず、猫の情報を出力する処理を作成しました。

上記のサンプルは猫の情報を定義し、その情報を出力します。

そして、猫の情報を変えてまた情報を出力しています。

猫の情報を確認する処理は

```java
System.out.println("この猫の名前は"+ mugi.name + "です。");
System.out.println(mugi.name + "ちゃんの毛色は"+mugi.color+"です。");
System.out.println(mugi.name + "ちゃんの種類は"+mugi.species+"です。");
System.out.println(mugi.name + "ちゃんは"+mugi.age+" 歳です。");
```
上記になります。この処理をメソッドでひとまとめると再利用しやすくなると思います。

上記の処理をメソッドにまとめてプログラムを作成すると

```java
public class ExcuteClass {

	public static void main(String[] args) {
		Cat mugi = new Cat();
		mugi.name = "ムギ";
		mugi.age = 3;
		mugi.species = "ロシアンブルー";
		mugi.color = "grey";
		
		mugi.displayInformation();
		
		mugi.name = "レオ";
		mugi.age = 5;
		
		mugi.displayInformation();
	}

}

class Cat {
	int age;
	String color;
	String species;
	String name;
	
	public void displayInformation() {
		System.out.println("この猫の名前は"+ this.name + "です。");
		System.out.println(this.name + "ちゃんの毛色は"+this.color+"です。");
		System.out.println(this.name + "ちゃんの種類は"+this.species+"です。");
		System.out.println(this.name + "ちゃんは"+this.age+" 歳です。");
	}
	
}
```
上記のようになり、もっと見やすいし、再利用しやすくなりました。


#終わりに

今回の記事は以上になります。

次回はJavaクラスの[コンストラクタ](https://qiita.com/DreamHanks/items/c8e96cf106abb69a1715)を学びましょう。

私たちの最新の記事は[こちら](http://blog.dreamhanks.com/java%e5%85%a5%e9%96%80%e8%ac%9b%e5%ba%a7/)で確認することができます。

ご覧いただきありがとうございます。