検索

キーワード


【Java】 オブジェクト指向「再利用性」を実現させる継承の考え方とは?

  • 公開日:2020-10-16 18:05:02
  • 最終更新日:2021-01-26 10:11:37
【Java】 オブジェクト指向「再利用性」を実現させる継承の考え方とは?

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私からアウトプットの意味も込めて、

オブジェクト指向の継承について紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:カプセル化の紹介 / 継承とオーバーライドの使い方紹介 / オブジェクト指向の紹介 / クラスの基本を紹介 / メソッドの紹介 / フィールドの紹介

継承(オブジェクト指向)の目的と実現方法

継承はプログラムの学習の中でも extends を使うことで頻繁に利用されるため、

オブジェクト指向の概念の中でも特にイメージがしやすい要素だと思います。

ここでは Java のプログラミングを始める前に概念を知りたいといった方にもわかりやすいように、

継承の概念についてオブジェクト指向の視点で一から紹介させていただきます。


継承とは?

一般的な継承は、親が持つ財産や技術、遺伝子を子孫が受け継ぐことを指しますが、

プログラミングの世界でも同じことを行うことができます。

Java での継承を紹介するためにまずは「クラス」や「メソッド」といった機能を簡単に説明します。


Java でプログラミングを行う場合、言語の記述はクラスというファイルに書き込んでいきます。

このクラスに書き込む内容は、

フィールドというクラスが持つ「データ」とメソッドという「データの処理」が主要となります。

オブジェクト指向で開発されるプログラムはこの「クラス」の情報をもとにして

具現化させたオブジェクトを組み合わせてプログラムを作り上げていきます。

プログラムを組み立てる過程で、クラスは大量に作成されます。

その中で同じようなメソッド(データの処理方法)を持つクラスが頻繁に発生します。


例えば、一眼レフClassとミラーレスClass、デジタルカメラClass、インスタントカメラClass

を作成する場合は、それぞれのカメラが別物であることがわかるはずです。

しかしカメラの機能として「写真撮影する」ということに対しては4つのカメラとも、共通した動作を行います。

この場合、一眼レフClassに「写真撮影をする」。ミラーレスClassに「写真撮影をする」。

デジタルカメラClassに「写真撮影をする」。インスタントカメラClassに「写真撮影をする」。

と書くと、「写真撮影をする」を4回書くことになります。

更に4種類のカメラそれぞれをメーカー別に10クラス作成することになれば

4種類 × 10メーカー で40回も「写真撮影をする」と書くことになります。

そしてすべてのカメラに「モノクロで撮影をする」機能を追加することになれば、

「モノクロで撮影をする」も同じく40回書かなくてはなりません。


このような状況に対して共通の処理を行うならばその部分を1つのカメラClassにまとめてしまい、

そのクラスを継承して一眼レフClassなどを作れば「写真撮影をする」を書く手間を省くことができます。

一例に過ぎませんが、上記は継承を行うケースです。

継承とは、既存のクラスまたはメソッドを「再利用」するということです。

再利用には「そのまま使用する」方法と、「上書きして使用する」方法の2つがあります。


「そのまま使用する」方法をとった場合は、継承先のクラスにメソッドを改めて記述する必要がありません。

例えば、カメラClass ▶継承▶ 一眼レフClass とした場合、

一眼レフClassに「写真撮影をする」は書かなくてよくなります。


「上書きして利用する」方法をとった場合は、メソッドの処理内容を書き換えることができます。

これを「オーバーライド」と呼びます。

例えば、カメラClass ▶継承▶ 一眼レフClass とした場合、一眼レフClassに「望遠撮影をする」などのように、

「写真撮影をする」の処理方法を上書きすることができます。



継承を行なったクラスは、継承元を親クラス(スーパークラス)、継承先を子クラス(サブクラス)と呼びます。

先ほどの例で言うとカメラClassが「親クラス」、一眼レフClassが「子クラス」です。

また継承は「is-a関係」とも呼ばれます。

「一眼レフはカメラです」と言えるように、派生したクラスとの関係を表します。

ただし「カメラは一眼レフです」と言うことはできません。

それはカメラが一眼レフ以外にも種類があるため一眼レフとは言い切れないためです。



継承の目的

先述のカメラの例でもわかるように、継承を使わずともプロジェクトを組み立てることは可能です。

それでも継承を使う理由はプログラマーにとって以下のようなメリットがあるためです。


オブジェクト指向 継承のメリット

・同じような機能を持つオブジェクトの共通点を1つのクラスにまとめることでクラスの継承を行い、

 プログラム全体を見やすくする。またプログラマーのコーディング量も減らすことができる。


・共通点を1つのクラスにまとめることでそのクラスを継承した子クラスは、

 親クラスのメソッドを改めて記述する必要がなくなる。

 また他の子クラスと振る舞いは同じだが異なる結果を返すオブジェクトの生成ができる。


・複数カ所で使うメソッドの処理内容に変更点が発生しても、

 継承を行うことで、メソッドの変更カ所を1カ所のみで済ますことができる。



一から新しくクラスなどを作らずとも既存のクラスやメソッドを再利用することで

開発効率を上げられるものが継承です。

簡単なサンプルコードで継承の例を見てみましょう。

継承は「子クラス extends 親クラス」の書き方をします。


◆継承の例

【親クラス】 sample メソッドを作成

public class Parent {

	// メソッド
	public void sample() {
		System.out.println("親クラス");
	}
}

【子クラス】 親クラスを継承。記述がなくても sample メソッドを継承している

public class Child extends Parent {
}


継承によって親が持っている sample メソッドを子が受け継ぎました。

受け継いだメソッドをそのまま使う場合は上記の子クラスのように無記述でも使うことができます。



オーバーライドとは?

オーバーライドは先述したように、親クラスのメソッドを上書くことができる継承の最も特徴的な機能で、

親クラスのメソッドを継承すると、子クラスでは子クラス特有のメソッドへ更新することができます。

このように機能を拡張させることができるため、継承の使い方がより幅広く実用的になります。


オブジェクト指向では全体的に抽象的なモノの使い方が大きな意味を持っていて、

継承のオーバーライドにも関わりが深いものとなっています。

例えば、冒頭の例で紹介したカメラの例の「写真撮影をする」メソッドをより抽象的に「撮影をする」

と記述にすることで(具体的な内容を記述しないことで)機能拡張の余地を持たせることができます。

「撮影をする」は「写真撮影」「動画撮影」「スロー撮影」「サーモグラフィ撮影」など様々な機能へ派生させられます。

ただしオーバーライドは1つのクラスで1回しかできないため注意が必要です。


◆メソッドのオーバーライド例

【親クラス】

public class Parent {

	// メソッド
	public void sample() {
		System.out.println("撮影");
	}
}

【子クラス①】 親クラスのメソッドをオーバーライド

public class Child extends Parent {

	// メソッドのオーバーライド
	public void sample() {
		System.out.println("写真撮影");
	}
}

【クラス②】 親クラスのメソッドをオーバーライド

public class Child2 extends Parent{

	// メソッドのオーバーライド
	public void sample() {
		System.out.println("動画撮影");
	}
}


「撮影」をオーバーライドした「写真撮影」と「動画撮影」のメソッドを持つクラスへ派生させました。

継承では「写真撮影のできる」機能を持ったクラスから複数の子クラスが作成できたことに対して、

オーバーライドを使うことで「撮影」機能に関連するクラスを複数作成することができるようになります。


オーバーライドは継承の概念に含まれた機能であるため、当然継承とオーバーライドを併用することも可能です。

◆継承とオーバーライドの併用

【親クラス】

public class Parent {

	// メソッド
	public void sampleA() {
		System.out.println("充電");
	}

	// オーバーライド用メソッド
	public void sampleB() {
		System.out.println("撮影");
	}
}

【子クラス】 充電の(sampleA)メソッドとオーバーライドした写真撮影の(sampleB)メソッドを持つ

public class Child extends Parent {

	// メソッドのオーバーライド
	public void sampleB() {
		System.out.println("写真撮影");
	}
}


各オブジェクトの組み合わせから成り立つプログラム(オブジェクト指向)という概念があるため、

継承やオーバーライドの仕組みが成り立ちます。

もちろん継承はオブジェクト指向を構成する一部に過ぎないため、

継承だけでオブジェクト指向のプログラミングができるわけではありませんが、

別記事で紹介している「カプセル化(独立性)」「ポリモーフィズム(拡張性)」を取り入れることで

オブジェクト指向のプログラミングができるようになります。

そのため継承もまたオブジェクト指向の柱となる重要な要素の1つです。



まとめ

オブジェクト指向では、

クラス単位で1つのオブジェクトと捉えることができるため継承という考え方が成り立ちます。

継承・カプセル化・ポリモーフィズムがそれぞれ作用し合ってオブジェクト指向を構成しているので、

それぞれの考え方を理解できるようにしましょう。

また「継承の具体的な書き方や使い方が知りたい」「クラスとは?」「メソッドとは?」などの疑問があれば、

それぞれをトピックとした記事を用意していますので確認してみてください。


関連記事リンク

カプセル化の紹介 / 継承とオーバーライドの使い方紹介 / オブジェクト指向の紹介 / クラスの基本を紹介 / メソッドの紹介 / フィールドの紹介



【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様