Java基礎 第13回『抽象クラスとは何なのかを学んでいこう』

目次

この記事について

Java基礎 第12回では継承について解説しました。
この記事は、オブジェクト指向プログラミングの重要な要素である「抽象クラス」について詳細に解説しています。抽象クラスの役割、基本概念、実装方法、そしてその利点と欠点について、具体的な例を交えてわかりやすく説明しています。

プログラミング初心者から中級者まで、抽象クラスの概念を理解し、適切に活用するための知識を深めたい方にとって非常に役に立つ内容です。オブジェクト指向プログラミングの基礎を強化したい方に強くおすすめの記事です。

抽象クラスの役割と重要性

オブジェクト指向プログラミングのキーとなる概念の1つに「抽象クラス」があります。抽象クラスとは、具体的な動作を持たない「設計図」のようなもので、その設計図に基づいてサブクラスが具体的な動作を持つように設計されます。このような設計図を用いる理由は、全てのオブジェクトが共通して持つべき性質や動作を一元管理し、それぞれのオブジェクトがどのように動くべきかを統一するためです。コードの再利用性が高まり、保守性が向上するというメリットがあります。

例えば、動物園の動物たちを考えてみましょう。動物園の動物たちはみな「食事をする」「眠る」という共通の動作を持っています。しかし、それぞれの動物が「何を食べるか」「どうやって眠るか」といった具体的な動作は大きく異なります。ここで抽象クラスが登場します。全ての動物が持つ共通の動作を定義する「動物」抽象クラスを作り、それを具体的な動物のクラス(例えば「象」クラスや「ペンギン」クラス)が継承することで、一貫性を保ったまま各動物の特性を表現することができます。

抽象クラスの基本概念

「抽象クラス」とは具体的な実装を持たないクラスのことを指します。抽象クラスはJavaでいうところのabstractキーワードを用いて定義され、その名の通り「抽象的」な概念を表現します。抽象クラス自体はインスタンス化することができず、具体的なクラス(具象クラス)が抽象クラスを継承してそのメソッドを実装(具体化)することにより使用します。

以下に「動物」を表す抽象クラスの例を示します。

abstract class Animal {
    abstract void eat();
    abstract void sleep();
}

このコードでは、動物が「食事をする(eat)」と「眠る(sleep)」という共通の動作を持つことを表現しています。ただし、その具体的な内容は定義されていません。これが抽象クラスの特徴であり、抽象クラスの強力な機能の一部です。

抽象メソッドの説明

抽象メソッドとは、その名の通り抽象クラス内で定義される「抽象的」なメソッドのことを指します。抽象メソッドはメソッドの宣言のみを行い、その具体的な実装は抽象クラスを継承する具象クラスが行います。抽象メソッドもまたabstractキーワードを用いて定義します。

たとえば、「動物」抽象クラスには「食事をする(eat)」と「眠る(sleep)」という抽象メソッドがありました。しかし、それぞれの動物がどのように食事をし、どのように眠るかは、動物の種類によります。したがって、それぞれの具体的な動作は、「象」クラスや「ペンギン」クラスなどの具象クラスが提供します。

まず、”動物”を抽象クラスとして定義し、その中に”食事をする(eat)”と”眠る(sleep)”という抽象メソッドを定義します。

abstract class Animal {
    // 抽象メソッド eat
    abstract void eat();

    // 抽象メソッド sleep
    abstract void sleep();
}

次に、この抽象クラスを継承する具象クラス”Elephant”(象)と”Penguin”(ペンギン)を定義し、抽象メソッドの具体的な実装を提供します。

class Elephant extends Animal {
    // 抽象メソッドの具体的な実装
    void eat() {
        System.out.println("The elephant is eating.");
    }

    void sleep() {
        System.out.println("The elephant is sleeping.");
    }
}

class Penguin extends Animal {
    // 抽象メソッドの具体的な実装
    void eat() {
        System.out.println("The penguin is eating.");
    }

    void sleep() {
        System.out.println("The penguin is sleeping.");
    }
}

そして、それぞれのクラスのインスタンスを生成し、メソッドを呼び出す例です。

Copy code
public class Main {
    public static void main(String[] args) {
        Elephant elephant = new Elephant();
        elephant.eat();
        elephant.sleep();

        Penguin penguin = new Penguin();
        penguin.eat();
        penguin.sleep();
    }
}

実行結果

The elephant is eating.
The elephant is sleeping.
The penguin is eating.
The penguin is sleeping.

この例では、Animalという抽象クラスが定義され、その中にeatとsleepという抽象メソッドがあります。それぞれの具体的な動作は、ElephantとPenguinという具象クラスが提供します。

抽象クラスの実装

抽象クラスは具体的な実装を持たないため、そのままではインスタンス化することができません。その代わり、具象クラスが抽象クラスを継承し、抽象メソッドを具体化(実装)することで初めて使用可能になります。

以下に、「象」クラスと「ペンギン」クラスが「動物」抽象クラスを継承し、抽象メソッドを実装する例を示します。

class Elephant extends Animal {
    void eat() {
        System.out.println("Elephant eats grass.");
    }
    void sleep() {
        System.out.println("Elephant sleeps standing up.");
    }
}

class Penguin extends Animal {
    void eat() {
        System.out.println("Penguin eats fish.");
    }
    void sleep() {
        System.out.println("Penguin sleeps with one eye open.");
    }
}

このように、抽象クラスを継承した各具象クラスでは、抽象メソッドが具体的な実装を持つようになり、それぞれの動物の特性を表現することができます。

抽象クラスの利点と欠点

利点

コードの再利用性:一度定義した抽象クラスや抽象メソッドを複数の具象クラスで再利用することができます。これにより、コードの重複を避け、効率的にプログラムを作成することができます。

コードの統一性:共通の振る舞いを一元的に管理することで、全体のコードの統一性を保つことができます。これにより、全体のコードの品質を向上させることができます。

柔軟性:抽象クラスを継承することで、必要に応じて振る舞いを追加したり変更したりすることが容易になります。

欠点

複雑性:抽象クラスと具象クラス、そして抽象メソッドとその実装という、複数の関連するコードを理解し、管理する必要があるため、コードの複雑性が増すことがあります。

柔軟性の制限:ある具象クラスが複数の抽象クラスから継承することは難しいため(一部のプログラミング言語では不可能)、柔軟性が制限されることがあります。

以上が抽象クラスの基本的な概念とその利用方法です。抽象クラスはコードの再利用性と統一性を向上させる一方で、複雑性を増す可能性があるため、適切に使い分けることが重要です。

まとめ

抽象クラスは最初はとっつきにくいテーマであるかもしれません。多くのプログラマーがこの概念につまずき、初めて出会ったときには頭を抱えることがあります。しかし、一緒にこの壁を乗り越えていきましょう。一度で全て理解しようとせず、何度もトライしていくことが一番の近道です。

抽象クラスを理解し、適切に活用することで、あなたのコーディングスキルは大きく向上します。
特にコードの再利用性と統一性の向上は、プログラマとしてのレベルを大きくあげていきます。

それでは、次回は抽象クラスと密接に関連する別の重要な概念、”インターフェース”について学びます。これもまた難しく感じるかもしれませんが、一緒に乗り越えていきましょう。
次回も是非お楽しみに!

(Visited 96 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社NEUGATEは、都内で企業研修や職業訓練を運営している会社です。主に、IT系の教育事業に力を入れています。
この記事は、株式会社NEUGATEの教育事業部が執筆をしています。

企業ホームページ:https://neugate.co.jp/

コメント

コメントする

目次