似てるようで違う・知ってるようでよく分かってない②

2023/08/30に公開

オーバーライドとオーバーロードの違い

「似てるようで違う・知ってるようでよく分かってない」の第2弾ということで、
今回は「オーバーライド」と「オーバーロード」の違いを取り上げてみたいと思います。

オブジェクト指向プログラミングでよく聞く用語に「オーバーライド」と「オーバーロード」があります。

どちらも「オーバー」という単語がついていて、言葉こそメチャクチャよく似ていますが、意味や使い方は全く違い、面白いと感じて取り上げてみました。

ここでは、オーバーライドとオーバーロードの違いを簡単に説明します。

オーバーライドとは

オーバーライドとは、親クラスで定義したメソッドを子クラスで書き換えることです。
親クラスとは、他のクラスに機能を引き継ぐ元となるクラスのことで、スーパークラスとも呼ばれます。
子クラスとは、親クラスから機能を引き継ぐ先のクラスのことで、サブクラスとも呼ばれます。

オーバーライドをする理由は、親クラスで定義されたメソッドの処理内容が子クラスに合わない場合や、子クラスでより詳細な処理を行いたい場合などです。

オーバーライドすることで、子クラスは親クラスのメソッドを自分の好きなように変更することができます。

例えば、以下のようなコードがあるとします。

// 動物クラス
class Animal {
  // 鳴き声メソッド
  public void cry() {
    System.out.println("動物の鳴き声");
  }
}

// 犬クラス(動物クラスを継承)
class Dog extends Animal {
  // 鳴き声メソッド(オーバーライド)
  public void cry() {
    System.out.println("ワンワン");
  }
}

// 猫クラス(動物クラスを継承)
class Cat extends Animal {
  // 鳴き声メソッド(オーバーライド)
  public void cry() {
    System.out.println("ニャー");
  }
}

このコードでは、動物クラスに鳴き声メソッドを定義していますが、動物によって鳴き声は異なります。
そこで、犬クラスと猫クラスでは、動物クラスから継承した鳴き声メソッドをオーバーライドして、それぞれの鳴き声を出力するようにしています。

オーバーロードとは

オーバーロードとは、同じ名前のメソッドを引数の数や型が異なるように複数定義することです。
引数とは、メソッドに渡す値のことです。同じ名前のメソッドでも、引数の数や型が違えば別のメソッドとして扱われます。

オーバーロードをする理由は、同じ機能でも引数によって処理内容が変わる場合や、引数の型に応じて柔軟に対応したい場合などです。

オーバーロードすることで、同じ名前のメソッドで異なる処理を行うことができます。

例えば、以下のようなコードがあるとします。

// 計算クラス
class Calculation {
  // 足し算メソッド(オーバーロード)
  public int add(int a, int b) {
    return a + b;
  }

  // 足し算メソッド(オーバーロード)
  public double add(double a, double b) {
    return a + b;
  }

  // 足し算メソッド(オーバーロード)
  public String add(String a, String b) {
    return a + b;
  }
}

このコードでは、計算クラスに足し算メソッドを定義していますが、引数の型によって処理内容が異なります。
整数同士の足し算、小数同士の足し算、文字列同士の結合というように、同じ名前のメソッドでオーバーロードしています。

おわりに

オーバーライドとオーバーロードは、どちらもメソッドの定義に関する用語ですが、以下のように違いがあります。

  • オーバーライドは、親クラスで定義したメソッドを子クラスで書き換えることです。
  • オーバーロードは、同じ名前のメソッドを引数の数や型が異なるように複数定義することです。

オブジェクト指向プログラミングでは、オーバーライドとオーバーロードを使って、メソッドの再利用性や多様性を高めることができます。

参考になれば幸いです。
ありがとうございました。(*◕ฺω◕ฺ)ノ

コラボスタイル Developers

Discussion