【Java】具象クラスと抽象クラスについて

f:id:hira98:20190518155129p:plain

【結論】

  • Javaには具象クラスと抽象クラスの2種類がある。

  • 具象クラスは、具象メソッド(処理を記述したメソッド)の集まりであるため、インスタンス化して使用できる。

  • 抽象クラスは、抽象メソッド(呼び方だけを定義したメソッド)の集まりであるため、直接インスタンス化して使用することはできない。

  • 抽象クラスをインスタンス化するには、抽象クラスを継承した具象クラスで全ての抽象メソッドをオーバーライドする必要がある。

  • 直接インスタンス化できない抽象クラスを用いる利点は2つある。

  • 1点目は「コンパイラのチェック機構により、コーディングミスの早期発見が可能になる。」

  • 2点目は「オーバーライドすべきメソッドが一目で分かるため、ソースの可読性が向上する。」

【目次】

具象クラスとは

具象クラスとは、具象という単語が意味する通り具体的なクラスです。

具象(ぐしょう);はっきりした姿・形を備えていること。具体。

引用:コトバンク

では、具体的なクラスとは何かというと、具象メソッド(実際に動作するプログラムが書かれたメソッド)が集まったクラスのことです。

具象クラスのサンプルを以下に示します。

この例では、getMorning()、getNoon()、getNight()のように処理が書かれたメソッドを具象メソッドと言います。 Greetクラスは朝昼晩の挨拶文を返す3つの具象メソッドの集まりであるため、具象クラスとなります。

また、わざわざクラスやメソッドを具象クラスや具象メソッドと表現する理由は、次で説明する抽象クラスや抽象メソッドと区別するためです。

抽象クラスとは

抽象クラスとは、抽象メソッド(具体的な処理ではなくメソッドの呼ばれ方だけを定義したメソッド)が集まったクラスのことです。

javaでは次のようにabstractキーワードを指定することで、抽象クラスや抽象メソッドを定義することができます。

抽象クラス
[修飾子] abstract class クラス名{}

抽象メソッド
abstract 戻り値 メソッド名()

抽象クラスのサンプルを以下に示します。

ソースを見れば分かるように処理は書かれていないため、これだけでは何の役にも立ちません。

具象クラスで継承し、抽象メソッドをオーバーライドし、かつ処理が書かれることでやっと実際の処理が行われます。

なぜ記述量が増えるのに、パッと見役に立ちそうにない抽象クラスを使うのか?

その理由について、次で説明します。

抽象クラスを使う利点

まずは、以下のサンプルソースを見てください。

日本語、中国語、英語の朝昼晩の挨拶を返すだけの簡単なプログラムです。

いきなり、サンプルソースを見せておいてなんですが、

このソースを見ただけでは、抽象クラスの利点は分かりにくいです。

なぜなら、抽象クラスを継承しなくても動作するからです。

ですが、想像してみてください。

数十人から数百人規模の大きなシステムの開発案件に携わり、

他人が開発したスーパークラスを継承したサブクラスを開発するケースを。

しかも、継承元のスーパークラスのソースは全部で1,000行😱

クラスの使い方を把握するだけで、一苦労です。

クラスの継承方法を把握し、いざ実装に入ったとしても、人間なのでミスをします。

  • オーバーライドしないといけないメソッドの実装漏れ
  • メソッド名のスペルミス。
  • …etc

これらのミスが発見されるのは、コンパイル後の動作確認の段階です。

ミスを修正するために、修正→コンパイル2度目の動作確認を行う必要があります。

このように、大規模開発では様々な問題点が発生します。

しかし、抽象クラスや抽象メソッドにabstaract定義を追加します。

すると、抽象クラスを継承した際に全ての抽象メソッドをオーバーライドしているかどうかをコンパイラがチェックするようになります。

結果、継承方法が間違っていればコンパイルエラーとなるため、ミスの早期発見に繋がります。

以上が、一見すると無駄に見える抽象クラスや抽象メソッドを定義する利点になります。

最後に

全く関係ないですが💦

気を抜くとYoutubeを見まくってしまう病をいい加減治したい😭😭