魁!dcWORKS塾 〜エンジニア編 vol.5〜

こんにちは! dcWORKSでエンジニアをしているミネです。
弊社のエンジニアチームやデザインチームの実態をより詳しく知ってもらうべく始まった「魁!dcWORKS塾」エンジニア編 第5回をお届けしていきます!

魁!dcWORKS塾とは?

技術研修や勉強会など、それぞれで実際に取り組んでいるような内容を問題・課題の形式でご紹介します。
エンジニアの問題では解答や解決するためのポイントを、またデザインチームでは制作過程など、各チームの取り組みを具体的に紹介していきますのでお楽しみに!
BLOGを見てくださっているみなさんも一緒に楽しみながら取り組んでいただけると嬉しいです。

エンジニア編 第5回ということで、弊社が運営しているプログラミングスクールのEngineersGateでも講師を務めるサトウ先生からの出題です。

人物紹介・サトウ先生
エンジニアズゲート講師。みんなから愛されるキャラクターとボディーの持ち主

問題

Animalという名前の親クラスを作成し、sound()というメソッドを定義してください。
sound()メソッドは、動物の鳴き声を出力するように実装してください。
Dog、Cat、Lionという名前の子クラスを作成し、それぞれAnimalクラスを継承してください。
また、各クラスには必要な変数とコンストラクタを定義してください。
main関数を持つクラスを作成し、Dog、Cat、Lionのオブジェクトを作成して、各オブジェクトのsound()メソッドを呼び出すプログラムを作成してください。

みなさん、解けましたか?
解答は下記です!サトウ先生からのワンポイントアドバイスもあるのでぜひ参考にしてみてください!

解答例

package lesson_04.works_01_01;

/**
* 4.継承
* <p>
* 1.Animalという名前の親クラスを作成し、sound()というメソッドを定義してください。
* sound()メソッドは、動物の鳴き声を出力するように実装してください。<br>
* <p>
* Dog、Cat、Lionという名前の子クラスを作成し、それぞれAnimalクラスを継承してください。
* また、各クラスには必要な変数とコンストラクタを定義してください。<br>
* <p>
* main関数を持つクラスを作成し、Dog、Cat、Lionのオブジェクトを作成して、
* 各オブジェクトのsound()メソッドを呼び出すプログラムを作成してください。<br>
*
* @author tomo-sato
*/
public class Lesson_04_01_01 {
    /**
    * main関数
    *
    * @param args 起動引数
    */
    public static void main(String[] args) {
        Animal dog = new Dog();
        System.out.println(dog.sound());
        Animal cat = new Cat();
        System.out.println(cat.sound());
        Animal lion = new Lion();
        System.out.println(lion.sound());
    }
}


Animal.java
package lesson_04.works_01_01;
/**
* 動物クラス。
*
* @author tomo-sato
*/
public class Animal {
    /** 鳴き声を表すプロパティ */
    protected String sound = null;
    /**
    * デフォルトコンストラクタ。
    */
    public Animal() {}
    /**
    * このクラスに設定された鳴き声を返す。
    * @return 鳴き声を返す。
    */
    public String sound() {
        return this.sound;
    }
}


Cat.java
package lesson_04.works_01_01;
/**
* 猫クラス。
*
* @author tomo-sato
*/
public class Cat extends Animal {
    /**
    * デフォルトコンストラクタ。
    */
    public Cat() {
        this.sound = "にゃん";
    }
}


Dog.java
package lesson_04.works_01_01;
/**
* 犬クラス。
*
* @author tomo-sato
*/
public class Dog extends Animal {
    /**
    * デフォルトコンストラクタ。
    */
    public Dog() {
        this.sound = "わん";
    }
}


Lion.java
package lesson_04.works_01_01;
/**
* ライオンクラス。
*
* @author tomo-sato
*/
public class Lion extends Animal {
    /**
    * デフォルトコンストラクタ。
    */
    public Lion() {
        this.sound = "がおー";
    }
}

サトウ先生によるワンポイントアドバイス

継承について
継承は、オブジェクト指向プログラミングにおいて重要な概念の一つで、既存のクラス(親クラス)をベースにして、新しいクラス(子クラス)を作成する仕組みです。
子クラスは、親クラスの特性(フィールドやメソッド)を継承し、それに加えて独自の特性を追加することができます。
継承を使うことで、コードの再利用性が向上し、プログラムの拡張性と柔軟性が高まります。
親クラスが共通の機能や特性を持っている場合、それらの機能を子クラスで再利用できるため、同じようなコードを繰り返し書く必要がありません。
解答例は、継承(親クラスと子クラスの関係)を示す例です。
継承によって、親クラス(Animalクラス)の機能を子クラス(Catクラス、Dogクラス、Lionクラス)が継承します。
親クラスの機能を共通化し、子クラスで特有の機能を追加する設計を理解しましょう

継承の特徴

/** 鳴き声を表すプロパティ */
protected String sound = null;

soundプロパティをprotectedで宣言しています。
このprotected修飾子により、子クラスからは直接アクセス可能ですが、他のパッケージからはアクセスできません。
また、Animalクラスにはsound()メソッドが実装されており、子クラスでオーバーライドすることを想定したデフォルト実装です。
このデフォルト実装を利用することで、子クラスで特定の鳴き声を持たない場合などでも、親クラスのsound()メソッドを利用できます。

/**
* このクラスに設定された鳴き声を返す。
* @return 鳴き声を返す。
*/
public String sound() {
    return this.sound;
}

Catクラスは、Animalクラスを継承して作成された子クラスです。
以下のように、CatクラスはAnimalクラスのsoundプロパティを継承し、猫に特有の鳴き声を設定しています。

/**
* デフォルトコンストラクタ。
*/
public Cat() {
    this.sound = "にゃん";
}

子クラスが親クラスのメソッドをオーバーライドすることで、子クラスに独自の動作を追加することができます。
まとめますと、継承は以下のような特徴を持ちます。

  1. コードの再利用性が高まる
    共通の機能や特性を親クラスにまとめることで、子クラスはそれを継承して使えます。
    結果として、同じ機能を複数のクラスで実装する必要がなくなり、コードの重複を防げます。
  2. プログラムの拡張性が向上する
    親クラスに新しい機能や特性を追加することで、全ての子クラスに自動的に反映されます。
    新しいクラスを追加したり、既存のクラスを改良したりする際にも、変更が局所的に行えるため、保守性が向上します。
  3. 多様性を実現する
    親クラスのメソッドを子クラスでオーバーライドすることで、同じメソッド名でも異なる動作を実現できます。
    この特性をポリモーフィズムと呼び、プログラムの柔軟性を高める効果があります。

継承の注意点
継承は柔軟な仕組みですが、過度に多重継承をするとコードの複雑性が増してしまうため、適切に使用することが重要です。
継承を使う場合は、適切な抽象化を行い、「猫は動物である」等の関係性が成り立つことを確認してください。
つまり、子クラスが親クラスの特性を持つことが自然な関係でなければなりません。
不適切な継承を行うと、コードの理解を難しくし、保守性を損なう可能性があるため、慎重な設計が必要です。
また、継承を利用する際には、親クラスが後々変更される可能性を考慮してください。
親クラスの変更が子クラスに影響を及ぼす場合、予期せぬバグが発生することがあります。
継承は強力なツールですが、慎重に使用することが重要です。
特に長期間のプロジェクトでは、コードの保守性や拡張性を考慮した上で、適切な継承の設計を行うことが良いプラクティスとなります。
以上のように、継承はオブジェクト指向プログラミングの中でも重要な概念であり、コードの再利用性や拡張性を高める上で有用です。
しかし、適切な設計が必要であり、継承以外の手法も含めて柔軟なアプローチを持つことが重要になります。
継承の理解を深め、プログラミングのスキルを向上させていきましょう!

メンバー募集のお知らせ

dcWORKSでは一緒に働く仲間を常時募集しています。私たちと一緒に人々の心を動かすものを創りませんか?
今なら就職お祝い金プレゼントキャンペーンを実施中です。ぜひご応募ください。

興味がある方は以下からお気軽にご応募ください。

募集要項はこちら

ITエンジニアを目指したい方へ

dcWORKSではIT業界の慢性的な人材不足解消・20代人材のキャリアプラン創造のためEngineers Gateを運営しています。
Engineers Gateでは無料でITエンジニア(プログラマー・インフラエンジニア)の育成型就職サポートを実施しております。

・IT業界に興味があるがどうやったら就職できるのか
・ITの勉強方法がわからない
・独学で限界を感じている方 etc

上記の様な悩みをお持ちの方は以下からお気軽に相談してください。

詳細はこちら

お気軽に
お問い合わせください。

CONTACT