🎯

Javaの基礎:オブジェクト指向の基本概念をわかりやすく解説

2025/01/06に公開

Javaのオブジェクト指向を学ぼう!

はじめに

Javaを学び始めると必ず耳にする「オブジェクト指向」。オブジェクト指向を理解すれば、Javaプログラミングがもっと楽しくなります!最初は難しく感じるかもしれませんが、基本を押さえればきっと大丈夫です。
本記事では、以下の3つのキーワードを中心にオブジェクト指向を解説します。

  • クラスとオブジェクト
  • カプセル化
  • 継承とポリモーフィズム

最後に簡単な実践例を交え、オブジェクト指向の理解を深めます。ぜひ最後までお読みください!


1. クラスとオブジェクト

クラスとは何か?

クラスは、設計図のようなものです。

例えば、コーヒーショップでは、コーヒーをメニューに登録し、それぞれの種類に名前や値段が設定されています。プログラムの世界では、「コーヒー」という設計図(クラス)を使って、ラテやエスプレッソといった具体的なコーヒー(オブジェクト)を作り出すイメージです。

// コーヒークラスの定義
class Coffee {
    String name;  // コーヒーの名前
    double price; // 値段

    // コーヒーの情報を表示するメソッド
    void displayInfo() {
        System.out.println(name + ": ¥" + price);
    }
}

オブジェクトとは何か?

オブジェクトは、クラスを基に作られる「実体」です。

ここでは、具体的なコーヒーがオブジェクトにあたります。

class Main {
    public static void main(String[] args) {
        // コーヒーオブジェクトを生成
        Coffee latte = new Coffee();
        latte.name = "ラテ";
        latte.price = 400;

        Coffee espresso = new Coffee();
        espresso.name = "エスプレッソ";
        espresso.price = 300;

        // コーヒー情報を表示
        latte.displayInfo();
        espresso.displayInfo();
    }
}

出力例:

ラテ: ¥400  
エスプレッソ: ¥300

クラスとオブジェクトの違い、理解できたでしょうか?
今度は、あなたの身近な例でも考えてみましょう!

2. カプセル化

カプセル化は、「データを外部から隠し、安全に操作する」仕組みです。Javaでは、アクセス修飾子(private, publicなど)を使ってカプセル化を実現します。

今回の例えでは、コーヒーショップで注文を受ける際、お客様は「コーヒー名」と「数量」を伝えます。しかし、注文の計算ロジックを直接操作されると困りますよね?そこで、「計算は内部で行い、外から触れる部分は最低限にする」工夫がカプセル化なんです。

改善前の問題

以下の例では、価格計算のロジックが外部に公開されると、無効な値が入力される可能性があります。

class Order {
    public String coffeeName;
    public int quantity;
    public double price;

    // 合計金額を計算するメソッド
    public double calculateTotal() {
        return quantity * price;
    }
}

この設計では、直接priceに負の値を設定されるリスクがあるので…

改善方法

フィールドをprivateで隠し、適切なメソッドを通じて値を操作します。

class Order {
    private String coffeeName;
    private int quantity;
    private double price;

    // コンストラクタで注文を初期化
    public Order(String coffeeName, int quantity, double price) {
        this.coffeeName = coffeeName;
        setQuantity(quantity);
        setPrice(price);
    }

    // 数量を設定(0以上のみ許可)
    public void setQuantity(int quantity) {
        if (quantity > 0) {
            this.quantity = quantity;
        } else {
            System.out.println("数量は1以上で指定してください。");
        }
    }

    // 価格を設定(0以上のみ許可)
    public void setPrice(double price) {
        if (price > 0) {
            this.price = price;
        } else {
            System.out.println("価格は0以上で指定してください。");
        }
    }

    // 合計金額を計算
    public double calculateTotal() {
        return quantity * price;
    }

    // 注文の詳細を表示
    public void displayOrder() {
        System.out.println(coffeeName + " × " + quantity + " : ¥" + calculateTotal());
    }
}
public class Main {
    public static void main(String[] args) {
        Order order = new Order("ラテ", 2, 400);
        order.displayOrder();
    }
}

出力例:

ラテ × 2 : ¥800

3. 継承とポリモーフィズム

継承

継承は、「既存のクラスを基に新しいクラスを作る」仕組みです。

コーヒーショップには、普通のお客様と割引を受けられる会員のお客様がいますよね。この違いをプログラムで表現するのが「継承」と「ポリモーフィズム」です。

継承: 共通の機能を持つ親クラス

すべての顧客に共通の機能(名前や料金の計算)をCustomerクラスとして定義します。

// 顧客クラス
class Customer {
    protected String name;

    public Customer(String name) {
        this.name = name;
    }

    public double calculatePrice(double basePrice) {
        return basePrice; // 通常料金
    }

    public void displayInfo(double basePrice) {
        System.out.println(name + "の料金: ¥" + calculatePrice(basePrice));
    }
}

子クラス: 特定の顧客タイプを表現

メンバーシップ割引を適用する顧客は、Customerを継承して作ります。

// 会員クラス
class MemberCustomer extends Customer {
    public MemberCustomer(String name) {
        super(name);
    }

    @Override
    public double calculatePrice(double basePrice) {
        return basePrice * 0.9; // 10%割引
    }
}

使用例

public class Main {
    public static void main(String[] args) {
        Customer regular = new Customer("通常顧客");
        Customer member = new MemberCustomer("会員顧客");

        double basePrice = 400;

        regular.displayInfo(basePrice);
        member.displayInfo(basePrice);
    }
}

出力例:

通常顧客の料金: ¥400  
会員顧客の料金: ¥360

継承とポリモーフィズムを使うと、コードを簡潔に再利用できます!

最後に

本記事では、オブジェクト指向の基本概念について紹介させていただきました。

  • クラスとオブジェクト:設計図(クラス)と具体的な実体(オブジェクト)。
  • カプセル化:内部ロジックを隠し、安全にデータを操作。
  • 継承とポリモーフィズム:共通の機能を親クラスに定義し、子クラスで振る舞いを拡張。

オブジェクト指向を理解することで、現実の問題をプログラムで解決しやすくなります。ぜひ、身近な例を使ってコードを書いてみてください!

Discussion