見出し画像

オブジェクト指向を考える

オブジェクト指向とは

オブジェクト指向ではプログラムをオブジェクトの集まりと考えます。
そしてオブジェクトはクラスから派生します。つまりクラスはオブジェクトの設計図みたいなものです。

オブジェクト指向を考える上で知っておかなければいけない概念として、

  • カプセル化

  • 継承

  • ポリモーフィズム

があります。これらの概念について一つずつ説明していきます。

カプセル化

カプセル化はクラス内のデータとそれを操作するメソッドを用いてオブジェクトの詳細を隠蔽して外部から直接アクセスできないようにする概念です。

これによりデータの安全性を高めることができます。

説明を聞くだけだと分かりづらいと思うのでコードを見ながら具体例で考えましょう。

カプセル化の実装は次のように行います。

  • プライベートフィールド : フィールドをプライベートで宣言して外部から直接アクセスできないようにします。

  • パブリックメソッド : ゲッターやセッターなどパブリックなメソッドでフィールドのデータを扱います。

コード例を見ていきます。

public class BankAccount {
    private double balance;  // プライベートフィールド、クラスの外部から直接アクセス不可

    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }

    // デポジットメソッド
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    // 引き出しメソッド
    public void withdraw(double amount) {
        if (amount > 0 && balance >= amount) {
            balance -= amount;
        }
    }

    // 残高を取得するパブリックメソッド
    public double getBalance() {
        return balance;
    }
}

BankAccountクラスはbalanceをプライベートフィールドとして持ちます。
プライベートなので外部から直接このデータにアクセスすることはできません。

クラスは設計図と言いましたが、設計図の内容を勝手に変えられないようにするということです。

そしてこのクラスの定義されているdeposit, withdraw, getBalanceメソッドを使用してのみフィールドの値にアクセスすることができます。

他のクラスからこのクラス(BankAccountクラス)のフィールドにアクセスするときに使うメソッドなのでpublicで定義します。

継承

継承はあるクラスが既存のクラスのプロパティやメソッドを引き継ぐことです。
同じコードを何度も書く必要がなくなるため効率的な開発が可能です。

これも実際の例で見ていきましょう。

// 親クラス
class Vehicle {
    protected String brand = "Ford";  // Vehicleクラスの属性

    public void honk() {  // Vehicleクラスのメソッド
        System.out.println("Tuut, tuut!");
    }
}

// Vehicleクラスを継承するCarクラス
class Car extends Vehicle {
    private String modelName = "Mustang";  // Carクラスの属性

    public static void main(String[] args) {
        // Carオブジェクトの作成
        Car myCar = new Car();

        // CarオブジェクトでVehicleクラスのメソッドを呼び出す
        myCar.honk();

        // CarオブジェクトのbrandとmodelNameの表示
        System.out.println(myCar.brand + " " + myCar.modelName);
    }
}

CarクラスはVehicleクラスを継承しています。継承を表すにはextendsキーワードを使用します。

Vehicleクラスを継承してるのでCarクラスはVehicleクラスのプロパティやメソッドを使用できます。

またCar独自のプロパティやメソッドを追加することも可能です。

なのでまとめると、CarクラスがVehicleクラスを継承をしたことで
Carクラスの独自プロパティとメソッド + Vehicleクラスのプロパティとメソッドを使用できます。

なので乗り物(Vehicle)クラスから、車(Car), 自転車(bike), トラック(track)などのオブジェクトを使うときに共通となる部分(走るなど)はVehicleクラスで持っておいて継承により使うことができます。

そしてタイヤの数などそれぞれで違うものは独自のプロパティやメソッドとして定義します。

ポリモーフィズム

ポリモーフィズムは異なるクラスのオブジェクトが同一のメソッドやインターフェースを使用して異なる挙動を示すことです。

分かりづらいですね。もっと大雑把にいうと、同じメソッドやインターフェースなのにオブジェクトによって異なる挙動をさせることがポリモーフィズムです。

これも具体例で考えましょう。

class Animal {
    public void sound() {
        System.out.println("Animal is making a sound");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog is barking");
    }
}

class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("Cat is meowing");
    }
}

public class TestPolymorphism {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myAnimal.sound();
        myDog.sound();
        myCat.sound();
    }
}

この例ではAnimalクラスがbarkメソッドを持っています。
そしてDogクラスCatクラスがAnimalクラスを継承しbarkメソッドをoverrideしています。

overrideがポリモーフィズム的な挙動です。

AnimalクラスのbarkメソッドをDogクラス、Catクラスそれぞれで修正しています。

このことにより、barkDogやbarkCatなどのメソッドを作成する必要がなくなります。

まとめ

今回は簡単にオブジェクト指向に関係のある概念(カプセル化、継承、ポリモーフィズム)を説明しました。

オブジェクト指向をより深く学びたい人は書籍などを購入してみるのも良いと思います!

この記事が気に入ったらサポートをしてみませんか?