【OOP】02_メンバー変数・メソッド・コンストラクター

こんにちは、コイキングです。

本記事では OOP(Object Oriented Programming == オブジェクト指向プログラミング)の説明のうち、メンバー変数・メソッド・コンストラクターについて、説明したいと思います。


******

※説明に使うコード

```java:Dog.java
public class Dog {

	// メンバー変数
	String name;
	int hp;
	
	// 静的(static) メンバー変数
	static String breed;
	static final String cryingSound = "Wang~!";
	
	
	// インスタンスメソッド 
	public void eat() {
		System.out.println("eat");
	}
	
	// メソッドオーバーロード
	public void eat(String food) {
		System.out.println("eat : "+food);
	}
		
	public String getName() {
		return name;
	}
	
	public int sleep(int time) {
		System.out.println("sleep");
		this.hp = time;
		return this.hp;
	}
	
	//  静的(static) メソッド 
	public static String getBreed() {
		return breed;
	}
	
	public static void crying() {
		System.out.println(cryingSound);
	}
	
	// コンストラクター(デフォルト)
	public Dog() {

	}
	
	// コンストラクター(引数設定)
	public Dog(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}
	
	
	// コンストラクター(コンストラクターのオーバーロード)
	public Dog(String name, int hp, String breed) {
		this(name, hp);
		this.breed = breed;
	}
	
}

```


# 1. メンバー変数
メンバー変数はクラスの内部に定義した変数を言い、現実のオブジェクトが持つ属性を洗い出して変数化したものだと言えます。
メンバー変数はインスタンス変数と静的変数に分けられます。

## 1) インスタンス変数
インスタンス変数はクラスを用いてインスタンスを生成した後から使えるメンバー変数です。
静的へんすうを使う状況ではない場合だいたいのメンバー変数はインスタンス変数として宣言すればよいです。

以下の通りインスタンス変数にアクセスできます。
**[参照変数].[インスタンス変数名]**

```java:
System.out.println("First Dog's Name : " + dog1.name);
System.out.println("Second Dog's Name : " + dog2.name);
```

## 2) 静的(static)変数
静的変数はインスタンスを生成しなくても使える変数です。

以下の通りインスタンス変数にアクセスできます。
**[参照変数 or クラス名].[インスタンス変数名]**

静的変数は全てのインスタンスが共有する値であるとも言えます。

```java:
Dog dog1 = new Dog();
Dog dog2 = new Dog("Happy", 100);
Dog dog3 = new Dog("Mary", 200, "Akita");

System.out.println("####################");
System.out.println("First Dog's Breed : " + dog1.breed);
System.out.println("Second Dog's Breed : " + dog2.breed);
System.out.println("Third Dog's Breed : " + dog3.breed);
System.out.println("Dog's Breed : " + Dog.breed);
System.out.println();
		
Dog.breed = "Nothing";
System.out.println("####################");
System.out.println("First Dog's Breed : " + dog1.breed);
System.out.println("Second Dog's Breed : " + dog2.breed);
System.out.println("Third Dog's Breed : " + dog3.breed);
System.out.println("Dog's Breed : " + Dog.breed);
System.out.println();

// 全ての値が変わっている
System.out.println("####################");
System.out.println("First Dog's CryingSound : " + dog1.cryingSound);
System.out.println("Second Dog's CryingSound : " + dog2.cryingSound);
System.out.println("Third Dog's CryingSound : " + dog3.cryingSound);
System.out.println("Dog's CryingSound : " + Dog.cryingSound);
System.out.println();
```

例示コードのdog1、dog2は静的変数breedに値を代入してないですが、dog3のインスタンス生成時に初期化した値の"Akita"をdog1、dog2のインスタンスでも使えます。

また、[クラス].[静的変数]の方式にて静的変数にアクセスし、他の値を代入すると、Dogクラスを用いて生成した全てのインスタンスから代入した値が使えるのが分かります。

# 2. メソッド
メソッドは現実のオブジェクトが持つ色々な行為をコード化したものと言えます。

メソッドインスタンスメソッドと静的メソッドに分けられます。

## 1) インスタンスメソッド
以下のような方式でインスタンスメソッドを呼出せます。
[参照変数].[メソッド名(引数...)]

```java:
// 戻り値 X / 引数 X
dog3.eat();
		
// 戻り値 X / 引数 O
dog3.eat("Meat");
		
// 戻り値 O / 引数 X
String dog3Name = dog3.getName();
System.out.println("Third Dog's Name : " + dog3Name);
		
// 戻り値 O / 引数 O
int hp = dog3.sleep(120);
System.out.println("Recovered HP : "+hp);
```

# 2) 静的(static)メソッド
以下のような方式で静的メソッドを呼出せます。
[参照変数 又は クラス名].[メソッド名(引数...)]

```java:
Dog.crying();
Dog.getBreed();
```

3) メソッドオーバーロード
メソッドオーバーロードは同じ名前のメソッドを複数定義する事ができることを言います。
メソッドオーバーロードの方法はメソッドの'引数の数'又は'データ型'を違うものに宣言すればよいです。

```java:
dog3.eat();
dog3.eat("Meat");
```

# 3.コンストラクター
## 1) インスタンスの初期化のためコンストラクターが要る
例示コードのdog1インスタンスを見るとインスタンスを作った直後メンバー変数の値は何も入ってない状態です。
この様な状態でメンバー変数の値を活用するメソッドを呼び出されると、元の設計された意図とおり動作しないはずです。
従って、インスタンスのメンバー変数は初期値の設定が必要です。

## 2) コンストラクターは？
コンストラクターはクラスを用いてインスタンスを生成する時に必ず一回呼び出される一種のメソッドです。

宣言は以下のような方式ですればよいです。

[クラス名](引数...) {

}

コンストラクターが必ず一回呼び出されると言っていましたが、今まで投稿した記事の例示コードには別途コンストラクターを宣言しておりませんでした。
こちらには理由がありまして、クラス内部にコンストラクターが明示されない場合はJavaがデフォルトコンストラクターを作ってくれるためです。
デフォルトコンストラクターはインスタンスを作るための役割だけ遂行するため、内容はありません。

```java:
public Dog() {

}
```

## 3) thisキーワード
thisキーワードはクラス内部からクラス自身を指す時に使います。
thisキーワードを使うとコンストラクターで引数を渡してもらう時に同じ変数名が使えます。

```java:
public Dog(String name, int hp) {
    this.name = name;
    this.hp = hp;
}
```

## コンストラクターのオーバーロード
値を初期化せず、インスタンスを生成する場合や、一部のメンバー変数の値だけ初期化したい場合、
コンストラクターを呼出す際に特定のロジックを呼び出したいなど...色々な条件を満たしてインスタンスを作りたいと思う場合、コンストラクターのオーバーロードを使えばよいです。

コンストラクターのオーバーロードを使う方法はメソッドのオーバーロードと同じくコンストラクターの引数の数を変えたり、データ型を違うものにすればよいです。

```java:
	// コンストラクター (デフォルト)
	public Dog() {

	}
	
	// コンストラクター (引数設定)
	public Dog(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}
	
	
	// コンストラクター (コンストラクターオーバーロードの応用)
	public Dog(String name, int hp, String breed) {
		this(name, hp);
		this.breed = breed;
	}
```

**this() メソッド**
this()メソッドはコンストラクターの内部でのみ呼び出せるメソッドで、コンストラクターの内部から別のコンストラクターを呼び出時に使います。

******

※ 例示コード
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/objective/basic02/Dog.java
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/objective/basic02/Main.java﻿


※ 韓国語のポストは以下のURLで確認できます。
https://koiking.tistory.com/88