【OOP】04_継承

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

本記事では OOP(Object Oriented Programming == オブジェクト指向プログラミング)の説明のうち、
継承について、説明したいと思います。

******

# 1. 継承とは?
**親クラスのメンバー変数とメソッド**を子クラスから**継承して使えること**を言います。

※ extendsキーワードを用いて継承する親クラスを定義し、継承かんけいを設定する事ができます。

public class 子クラス extends 親クラス { 

}

※ 例示コード

```java:Animal.java
public class Animal {
	protected String name;
	protected int age;
	
	public Animal() {}

	public Animal(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public void printName() {
		System.out.println(this.name);
	}
	
	public void printAge() {
		System.out.println(this.age);
	}
	
	protected void eat() {
		System.out.println("eat");
	}
	
	protected void sleep() {
		System.out.println("sleep");
	}
}
```

```java:Dog.java
public class Dog extends Animal {
	
	protected String breed;
	protected String cryingSound = "Wang~!";
	
	public Dog(String name, int age) {
		super(name, age);
	}
	
	public void crying() {
		System.out.println(this.cryingSound);
	}
	
	@Override
	public void printName() {
		System.out.println("Dog's Name : "+ this.name);
	}
	
}
```

```java:Person.java
public class Person extends Animal {
	
	public String language;
	
	public Person(String name, int age) {
		super(name, age);
	}
	
	public void speaking() {
		System.out.println("speaking : "+this.language);
	}
	
	@Override
	public void printName() {
		System.out.println("Person's Name : "+ this.name);
	}
	
}
```

# 2. 継承可能な親クラスの要素
public・protected・defaultで定義されているメンバー変数とメソッド
※ ただし、defaultの場合は同じパッケージ内でたけ使えます。

```java:
public static void main(String[] args) {
    Dog dog = new Dog("Happy", 3, "Akita");
    Person person = new Person("David", 20, "English");
		
    // System.out.println(dog.age);   // privateのため、子クラスで使えない。
    System.out.println(dog.name);     // protectedのため、子クラスで使える。
    System.out.println(dog.getAge()); // publicのため、子クラスで使える。
}
```


# 3. 継承を使う理由
親クラスに共通の属性と行為を定義し、子クラスには子クラスなりの属性と行為を定義する事で**楽にコードを再活用できるし、機能の拡張が容易**です。
継承は上記のような長所がありますが、親クラスの要らないコードまで継承しないといけないため、**コードが肥大になるかもしれないという短所**があります。

```java:
// 共通機能を親に定義すると、子クラスでは子クラスなりのコードを実装すればよい。
System.out.println("Dog's Age : "+dog.getAge());
System.out.println("Person's Age : "+person.getAge());
		
// 子クラスなりの機能
dog.crying();
person.speaking();

```

# 4. super()
親クラスの要素のうち、**コンストラクターは継承できません。**
では引数が含まれていうるコンストラクターが定義されている親クラスを継承するためにはどうすればいいでしょう？
この様な場合は**子クラスのコンストラクターからsuper()を使い親クラスのコンストラクターのうち、どちらかを呼び出せばよい**です。

```java:
public Person(String name, int age, String language) {
    super(name, age);    // 親のコンストラクターを呼び出す。
    this.language = language;
}

public Dog(String name, int age, String breed) {
    super(name, age);    // 親のコンストラクターを呼び出す。
    this.breed = breed;
}

```

# 5. オーバーライド
オーバーライドは親クラスのメソッドを子クラスで再定義することで、
 **子クラスごとに違くメソッドを再定義して、同じメソッドを呼び出して違う結果を出す**事ができます。

※　こちらの辺はポリモーフィズムを説明する時にまた扱うつもりです。

```java:
public class Person extends Animal {
    ...
	@Override
	public void printName() {
		System.out.println("Person's Name : "+ this.name);
	}
}

public class Dog extends Animal {
    ...
	@Override
	public void printName() {
		System.out.println("Dog's Name : "+ this.name);
	}
}

// override
dog.printName();
person.printName();

```

※ 例示コード
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/objective/basic04

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