2025年度 新入社員研修報告⑥

開発

Date:2025.07.16

研修中に困らせてきた「継承」

こんにちは!新入社員のK.Fです!
長かったような短かったような研修期間も終わりに近づいています。

先日、研修生の集大成とも言える自主制作発表会が無事終了しました!
私のシステムは賛否両論がある感じでしたが、全員がGoodしてくれるようなものを作りたかったと悔しい思いもあり・・・。
この気持ちは次の仕事で見返していこうと思っています!見てくださった皆様、本当にありがとうございました!

さて、研修期間を振り返ってみると新しいことにぶつかる毎日でした。
Java、HTML&CSS、JavaScript、SQL・・・。
学生時代にPythonしか使っていなかった自分としては、どや顔のチャンスが一切なかった3カ月間でした。
今回はそんなずっと溺れかけながらなんとか耐えてきた私のつまづいて、抜け出すのが大変だった「継承」と、ついでに困らせてきたインターフェイスについて書こうと思います。
どうか皆さんが始めたての時と同じでありますように・・・。


1. 継承っていつ使うの

Javaの基礎を学ぶ中で、突然ラスボスのように現れたのが「継承」でした。
学習のために使用したアプリ内でのセクションが長い割に、初心者の自分にとっては最後まで何を言っているのかさっぱり。

「どういう基準で親クラスを決めてるの?」

「親クラスのメソッドが使えるってどういうこと?」

「スーパーってなに?」

頭の中ははてなだらけでした。
何よりもデータ型を設定するところに、クラス名を入れる意味が一生わからず、「こんなん使うくらいなら毎回同じメソッドを書く!」と怒りながら作業をしていました。・・・が、

最近やっとコードの全体を見れるようになってきて、「同じ役割のコード書くのめんどくさいな」と思えるように。

実際、今回の自主制作のシステムは継承を一切使わず書ききりましたが、今思えば無駄が多かったなぁと反省しています。成長です。
そこで、皆さんからすると今更な内容かもしれませんが「継承」について自分の勉強だと思って少し記載させていただきます。
もし誤った理解の仕方をしていれば、ご連絡いただけると嬉しいです。

継承

親クラス(スーパークラス)のフィールド(変数)やメソッド(処理)を、子クラス(サブクラス)がそのまま引き継いで使える仕組み

親クラス(スーパークラス)

class Animal {
  String name = "犬";

  public void move() {
    System.out.println(name + "は歩きます");
  }
}

子クラス(サブクラス)

class Dog extends Animal {
  public void bark() {
    System.out.println(name + "は吠えている");
  }

  @Override
  public void move() {
    System.out.println(name + "は走ります");
  }
}

メインクラス

public Class Main {
  Dog dog = new Dog();

  dog.name = "ポチ"

  dog.move(); //オーバーライドした方のクラスが反映
  dog.bark();
}

これなんの意味があるの?

まあ書いてみましたけど、初見の私からすると 「いや別々で書いているのと変わらんじゃん」 って感じでした。
でもよく見ると、子クラスではフィールド name を定義していないのに、使えているのを発見しました。
このとき、ふと思いました。

「もしかして『継承』って、コードが短い初心者用アプリでは本当の力を発揮しないのでは?」
もし、現場で扱うような大規模システムになったらどうでしょう?

たくさんのファイル、たくさんのコードの中で、共通の処理やデータをまとめて持てるって、めちゃくちゃ便利な仕組みなんじゃ・・・?
つまり、こいつのメリットって 『このクラスは〇〇という共通の仲間ですよ』と、開発者同士で認識を共有できることなのではないか?
ラスボスのことを少し理解できたかもしれません。
仲良くやっていけそうです。


2.インターフェイスっている?

続いて継承の前だったか、後だったかに出てきた 「インターフェイス」 です。
説明の時に純粋に感じたことが、「これほんまにいるん?」でした。
メソッドっぽいことは書いてあるけど、肝心の中身がないし・・。ルールブックみたいなものって書いてあるけど、どゆこと?
というわけでこれも再勉強です。

インターフェイス

「どんな名前のメソッドを、どんな形(引数や戻り値)で用意しておいて!」ってだけを決めて、中身の処理は決めない設計図みたいなもの

インターフェイス コード

interface Animal {
  void move(String distance, int speed);
}

クラス1

class Dog implements Animal {
  public void move(String distance, int speed) {
    System.out.println("犬が " + distance + " 先まで " + speed + "km/h で走ります。");
  }
}

クラス2

class Turtle implements Animal {
  public void move(String distance, int speed) {
    System.out.println("カメが " + distance + " 先まで " + speed + "km/h でゆっくり歩きます。");
  }
}

メインクラス

public class Main {
  public static void main(String[] args) {
    Animal dog = new Dog();
    Animal turtle = new Turtle();

    dog.move("100m", 20);       // 犬が 100m 先まで 20km/h で走ります。
    turtle.move("30m", 1);      // カメが 30m 先まで 1km/h でゆっくり歩きます。
  }
}

これなんの意味がある?
冒頭でも言ったように、ルールだけ決めておくって意味ある?その都度書けばよくね?と思っていました。

正直、未だにその感覚は抜けきっていません。ただなんか使ってたらかっこいいなぁという理由で、自主制作にインターフェイスを取り入れてみました。
何回もエラーが出る中で、ようやくインターフェイスを使った情報の受け渡しを成功させることができました。

あの時の高揚感と達成感は言葉に表しきれません。外国人に自分の英語が通用するような感覚でした。
継承と同じで、やはり当時の自分には大きなシステムで作業をするという経験が足りませんでした。

システムがより大きなものになっていく中で、名前は違えど、ほぼ同じ引数を扱っているメソッドが自分の意識の外側で作成してしまっていることがありました。
そうした中であらかじめ自分が考えたルールを定めておけることは、後々の無駄な作業を増やさずに済みます。

また他の開発者の方と開発する際に、使うメソッドがまとめられているのも利点であると考えます。
つまり、インターフェイスのメリットは 不必要な実装の重複を防ぐことが出来ることと、 「このクラスたちは同じルールに従ってるよ」って他の開発者に伝えられることなのではないでしょうか。
現在理解できないことでも、もっと難しいことにチャレンジし、視野を変えていけば理解できるようになるかもしれないと研修期間中に感じることができて良かったと思います。


3. 最後に

いかがでしたでしょうか。
正直、研修期間中で一番頭を悩ませたのはこの二つでした。細かく振り返れば他にもあったかもしれませんが、おそらく覚えていないということは、この二つが特に困難だったのだと思います。

研修を振り返って最も強く感じるのは、単純に「楽しかった」ということです。

最初は大量に用意された研修スケジュールを見て不安もありましたが、技術力の向上を感覚ではなくシステムの挙動として実感できるため、自信を持ちやすいという点が、楽しさにつながっているんだろうなと思います。

また、わかりやすい説明や質問しやすい環境を整えてくださった講師の方々や先輩方には、本当に感謝しています。
ありがとうございました!
引き続き、ご指導、ご鞭撻のほどよろしくお願いいたします。

34.png

BLOG TOP

Recommend