プログラミング言語を勉強していると出会う言葉に「抽象クラス」というものがある。
また似たような言葉で「インターフェース」というものもあり、両者の違いを初心者が理解するのはなかなか難しい。
今回は「抽象クラス」と「インターフェース」の違いについて、現役エンジニアのおおつけと一緒に解説していきます。

ライター/おおつけ

現役システムエンジニア兼ライター。前職は貿易商社の営業マン。知らない言葉は徹底的に調べるクセがあり、独自の単語帳を作っている。日々たくわえた広い知識を、わかりやすく紹介していく。

抽象クラスとインターフェースの定義

image by iStockphoto

いわゆるオブジェクト指向のプログラミング言語において登場する言葉「抽象クラス」と「インターフェース」。参考書やネットの記事を読んだだけでは理解できないというプログラミング学習者の方も多いのではないでしょうか。ここではまず「抽象クラス」と「インターフェース」それぞれの定義について見ていきましょう。

抽象クラス:具体的な処理を記載しないクラス

「抽象クラス」とは具体的な処理を記載しないクラスです。機能を実装する際に使っているクラスの上位クラスにあたります。

たとえば皆さんが「イヌ」というクラスを実装するにあたって、その上位の概念を抽象クラス「動物」に定義したとしましょう。すべての「動物」は代謝機能を持ちますが、その代謝機能の内容は各「動物」ごとに異なっています。つまり「動物は代謝機能を持つ」と言う漠然とした定義を行い、具体的な処理までを記載しないのが「抽象クラス」です。

インターフェース:具体的な処理を記載しないメソッドと変数

「インターフェース」とは具体的な処理を記載しない、メソッドと変数のみの特別なクラスです。目的は処理の形式を共通化すること。

たとえばとある社内システムの「インターフェース」が「利益計算処理(メソッド)」と「売上(変数)」と「原価(変数)」を定義していたとします。こうすることで「利益計算処理を実装するときは売上と原価を使用する」ことがルールとして適用できるのです。

抽象クラスとインターフェースの違い

image by iStockphoto

「抽象クラス」と「インターフェース」それぞれの定義を知ったところで、本題である両者の違いに迫っていきましょう。一見似たような定義ですが、そこには大きな役割の違いがあるのです。

\次のページで「抽象クラス:抽象的な「概念」を定義する」を解説!/

抽象クラス:抽象的な「概念」を定義する

「抽象クラス」はそれだけではインスタンス化できないクラスです。インスタンス化ということは実体を持てないということ。「動物」という概念は人間が作り上げた抽象的なもので、実体がありませんよね。しかし「動物」は動作、代謝、生殖といった共通の機能を持っていることは間違いないのです。

もし「抽象クラス」がなければ、各クラスが本来持つべき機能を持たなかったり、持つべきでない機能を持ってしまうことになります。こういったことを防ぐための「型」を作ること、そこに「抽象クラス」の存在意義があるのです。

インターフェース:共通の「ふるまい」を定義する

「抽象クラス」に対して「インターフェース」はあくまで共通の「ふるまい」を定義します。たとえば「泳ぐ」という「ふるまい」は「魚」だけのものでしょうか。実際は「カエル」のような両生類、「ワニ」のような爬虫類、「ペンギン」のような鳥類、「アザラシ」のような哺乳類も「泳ぐ」ことは可能です。

「魚」という「抽象クラス」を「マグロ」は継承できますが、「カエル」は継承できません。しかし「泳ぐ」という「ふるまい」は実装したいですよね。そんなときに「泳ぐ」という「ふるまい」をピンポイントで実装できるのが「インターフェース」なのです。

抽象クラスとインターフェースの使い分け

image by iStockphoto

ここまでの説明を聞いて「抽象クラス」と「インターフェース」のどちらも、具体的な処理は記載しないという性質があることをおわかりいただけたと思います。これだけだとほぼ同じ機能のように思えてしまいますね。ここでは「抽象クラス」と「インターフェース」の使い分け方を解説していきます。

類似クラスで共通の機能を持ちたいなら抽象クラス

たとえばクラス「ネコ」とクラス「トラ」を実装したいとき、抽象クラス「ネコ科」を継承すれば共通の機能はどちらのクラスも持つことができますよね。このように概念上の親子関係が明確であれば、実装を一本化できるため「抽象クラス」は有効です。

またクラス「イヌ」から抽象クラス「ネコ科」は継承されたくないですよね。概念上「ネコ科」の条件を満たしている動物以外には継承させてはいけません。このような要望に応えるため、「抽象クラス」は内部向け(protected)というスコープ(公開範囲)を設定することができます。

複数クラスから多重継承したいならインターフェース

「インターフェース」はクラスではあるものの、「型」から機能のみを完全に分離して記載された特別なクラスです。このため「多重継承」を行うことができます。

「多重継承」とは複数の親クラスから継承を行うことです。「ネコ」は抽象クラス「ネコ科」と抽象クラス「イヌ科」のどちらも継承することはできませんよね。しかしこれが「ふるまい」のみを継承するのであれば問題ありません。インターフェース「噛む」とインターフェース「飲み込む」は、同時に継承しても不都合は生じませんよね。

「ふるまい」自体は「型」に縛られないため、「インターフェース」のスコープは常に全体公開(public)となります。

\次のページで「「抽象クラス」は「概念」を定義、「インターフェース」は「ふるまい」を定義」を解説!/

「抽象クラス」は「概念」を定義、「インターフェース」は「ふるまい」を定義

ここまで「抽象クラス」と「インターフェース」のそもそも意味、両者の違い、そして使い分け方までを見てきました。一見とっつきにくい内容ではありますが、記事を読む以前よりは理解が深まったのではないでしょうか。

オブジェクト指向はオブジェクト(対象)を中心とした考え方です。ここでいうオブジェクトはデータと処理の集まりを指しています。哺乳類も鳥類も魚類もまったく別の動物ですが、オブジェクトに注目すると共通点がいろいろと見つかりますよね。そのような共通点をできるだけまとめることで効率化を図っているのがオブジェクト指向。その共通点のまとめ方が「抽象クラス」と「インターフェース」なのです。

" /> 3分でわかる抽象クラスとインターフェースの違い!定義や使い分けも現役エンジニアがわかりやすく解説 – Study-Z
IT・プログラミング雑学

3分でわかる抽象クラスとインターフェースの違い!定義や使い分けも現役エンジニアがわかりやすく解説

プログラミング言語を勉強していると出会う言葉に「抽象クラス」というものがある。
また似たような言葉で「インターフェース」というものもあり、両者の違いを初心者が理解するのはなかなか難しい。
今回は「抽象クラス」と「インターフェース」の違いについて、現役エンジニアのおおつけと一緒に解説していきます。

ライター/おおつけ

現役システムエンジニア兼ライター。前職は貿易商社の営業マン。知らない言葉は徹底的に調べるクセがあり、独自の単語帳を作っている。日々たくわえた広い知識を、わかりやすく紹介していく。

抽象クラスとインターフェースの定義

image by iStockphoto

いわゆるオブジェクト指向のプログラミング言語において登場する言葉「抽象クラス」と「インターフェース」。参考書やネットの記事を読んだだけでは理解できないというプログラミング学習者の方も多いのではないでしょうか。ここではまず「抽象クラス」と「インターフェース」それぞれの定義について見ていきましょう。

抽象クラス:具体的な処理を記載しないクラス

「抽象クラス」とは具体的な処理を記載しないクラスです。機能を実装する際に使っているクラスの上位クラスにあたります。

たとえば皆さんが「イヌ」というクラスを実装するにあたって、その上位の概念を抽象クラス「動物」に定義したとしましょう。すべての「動物」は代謝機能を持ちますが、その代謝機能の内容は各「動物」ごとに異なっています。つまり「動物は代謝機能を持つ」と言う漠然とした定義を行い、具体的な処理までを記載しないのが「抽象クラス」です。

インターフェース:具体的な処理を記載しないメソッドと変数

「インターフェース」とは具体的な処理を記載しない、メソッドと変数のみの特別なクラスです。目的は処理の形式を共通化すること。

たとえばとある社内システムの「インターフェース」が「利益計算処理(メソッド)」と「売上(変数)」と「原価(変数)」を定義していたとします。こうすることで「利益計算処理を実装するときは売上と原価を使用する」ことがルールとして適用できるのです。

抽象クラスとインターフェースの違い

image by iStockphoto

「抽象クラス」と「インターフェース」それぞれの定義を知ったところで、本題である両者の違いに迫っていきましょう。一見似たような定義ですが、そこには大きな役割の違いがあるのです。

\次のページで「抽象クラス:抽象的な「概念」を定義する」を解説!/

次のページを読む
1 2 3
Share: