オブジェクト指向 - object-oriented(Java 第3回)

はじめに

第3回はオブジェクト指向である。
名前が強そうだが、慣れてしまえば難しくないという印象。結局実務で初めて役に立つみたいなところあるので、勉強したての頃はあんま実感わかなくて当然感はある。

オブジェクト指向とは

オブジェクト指向(object-oriented)とは、データとコードを含む「オブジェクト」と呼ばれる概念に基づいた枠組み。
データをフィールドの形(attributes)で、コードを手順の形(methods)で表現する。

オブジェクト指向の解説

オブジェクト指向プログラミング(以下OOPとする)には、重要な概念がある。

カプセル化(Encapsulation):
オブジェクト内部の情報を隠蔽し、内部データ(private)と外部から呼び出せるインターフェース(public)に分割すること。

継承(Inheritance):
既に定義されているクラスのメンバ(fieldやmethod)を、別の新しいクラスが受け継ぐこと。継承による効果は、
- コードの再利用性が上がる
- クラスの階層構造を構築できる
- コードをDRY(Don't Repeat Yourself)に保てる
継承は "is-a" relationship を表現できる 。例えば、犬クラスと動物クラスがあった場合、「犬は動物である」という関係が継承で表現できる。

ポリモーフィズム(polymorphism):
異なるクラスのオブジェクトを共通のスーパークラスのオブジェクトのように扱うこと。// Use the superclass reference to refer to the subclass の行でスーパークラスのオブジェクトのサブクラスのオブジェクトに参照している。

// Superclass
abstract class Animal {
    // Abstract method (does not have a body)
    public abstract void makeSound();
}

// Subclass
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

// Another subclass
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow!");
    }
}

// Main class to demonstrate polymorphism
public class PolymorphismExample {
    public static void main(String[] args) {
        // Create objects of the subclasses
        Dog dog = new Dog();
        Cat cat = new Cat();

        // Use the superclass reference to refer to the subclasses
        Animal animal1 = dog;
        Animal animal2 = cat;

        // Call the overridden method
        animal1.makeSound(); // Outputs "Woof!"
        animal2.makeSound(); // Outputs "Meow!"
    }
}

抽象化(Abstraction):
抽象クラス(abstract class)内で、抽象メソッド(名前だけ)作って、サブクラスでオーバーライドして内容を記述する。

// Abstract class
abstract class Vehicle {
    // Fields
    protected String brand;
    protected String model;

    // Constructor
    public Vehicle(String brand, String model) {
        this.brand = brand;
        this.model = model;
    }

    // Abstract method (does not have a body)
    public abstract void drive();
}

// Concrete subclass
class Car extends Vehicle {
    public Car(String brand, String model) {
        super(brand, model);
    }

    // Implement the abstract method
    @Override
    public void drive() {
        System.out.println("The car is driving.");
    }
}

// Main class to demonstrate abstraction
public class AbstractionExample {
    public static void main(String[] args) {
        // Create an object of the concrete subclass
        Car car = new Car("Toyota", "Camry");

        // Call the abstract method through the concrete object
        car.drive(); // Outputs "The car is driving."
    }
}

疑問点

「PolymorphismとAbstractionってコードの形が似てね?オーバーライドしてるし。」

Polymorphism
スーパークラス(superclass)で抽象メソッド(名前だけ)作って、サブクラスでオーバーライドして内容を記述する。 使う時は、サブクラスのオブジェクトに参照したスーパークラスのオブジェクトで。

Abstraction
継承クラス(abstraction class)で抽象メソッド(名前だけ)を作って、サブクラスでオーバーライドして内容を記述する。 使う時は、サブクラスのオブジェクトで。

まとめ

たぶんOOPは、実際のコードの書き方とOOPの意図との結びつきが、初学者に実感されにくいのだと思う。
OOPのお気持ちみたいのなところに触れ始めるとキリがないので、個々を扱うときに詳しくやる。
第4回はクラス・インスタンスです。

注意

このページは大学のJavaの授業の予習で書いています。
直観的な理解をメモしているだけなので、厳密なところでは誤りがあるかもしれません。