8/21 ポリモーフィズムとは

ポリモーフィズムとは、子クラスのインスタンスを親クラス型の変数に代入できる仕組みのことを指します。このとき子クラスと親クラスの関係はIs-a関係である必要があります。

あるクラスのインスタンスを生成したときに返される参照は、そのクラスの親クラス型の変数にも代入することができます。これをポリモーフィズムと呼びます。子クラスと親クラスがIs-a関係であれば、複数の異なるインスタンスを親クラス型の配列でまとめて扱うことができるようになります。また、このとき子クラスでオーバーライドされたメソッドがある場合、見かけ上は親クラスのメソッドが呼び出されていたとしても、各インスタンスはそれぞれのクラスで定義されたメソッドに従って動作を行います。

ポリモーフィズムのメリットは、どのクラスのインスタンスを扱っているかを意識する必要がないことです。たとえ子クラスに変更があったとしても、ポリモーフィズムを用いて定義されたプログラムに影響はありません。このように、ポリモーフィズムを用いることで変更に強い設計をすることができるようになります。

学習時間

Java 2.75h

本日までの合計 202.5h

8/20 継承とは

継承とは、既存のクラスのフィールドやメソッドなどを共有した新たなクラスを定義することです。継承元のクラスを親クラスや基底クラス、スーパークラスなどと呼び、継承先のクラスのことを子クラスや派生クラス、サブクラスなどと呼びます。

複数のクラスに共通するメンバがあるとき、何度も同じプログラムを書くのは非効率であるだけでなく、その書き方の整合性についても問題となります。そこで、共通部分を親クラスとして定義し、その差分のみを子クラスに定義することで同じプログラムを書く手間が省け、生産効率を高めることができます。このようなプログラミング手法のことを「差分プログラミング」と呼びます。

この差分プログラミングについては、継承を用いることによって既存のクラスの再利用性を高めることができると考えられてきました。しかし、開発規模が大きくなるほど「どのクラスがこのクラスを継承しているか」の把握が困難となるため、親クラスの変更が子クラスに予期せぬ影響を及ぼす可能性もあります。したがって、差分プログラミングの実現のために継承を用いることは変更に弱い設計となってしまうことから適切ではありません。継承を用いる主な目的とは、ポリモーフィズムを実現し変更に強い設計とするためです。

なお、BがAを継承する場合、"B is a A."、つまりBはAの一種であるといった関係でなくてはいけません。これを「Is-a関係」と呼びます。フィールドやメソッドが流用できるからといってIs-a関係でないクラス間に継承を用いるのは、ポリモーフィズムが実現できなくなる点からも適切ではありません。

学習時間

Java 3.25h

本日までの合計 199.75h

8/19 カプセル化とは

カプセル化とは、関係するフィールドやメソッドを1つのクラスにまとめることをいいます。また、アクセス修飾子を用いてほかのクラスに定義されたメソッドからフィールドの値を直接変えられないようにすることを「データ隠蔽」と呼び、カプセル化という用語はこのデータ隠蔽のことを指して使う場合もあります。

カプセル化は、そのクラスが何のために設計されたクラスなのか、クラスの目的を明確にするために行うものです。関係性の低いものをクラスから排除し、関係するものが1つのクラスにまとめられている状態を目指します。したがって、ほかのクラスで定義されたメソッドが、フィールドの値を直接変更できるような設計はふさわしくありません。フィールドの値を変更するメソッドは、フィールドと同じクラスに定義されているべきです。

Javaではフィールドの値を予期せぬ変更から守るために、アクセス修飾子を用います。アクセス修飾子を用いることで、ほかのクラスで定義されたメソッドからフィールドの値を直接変更できないように制限することができます。これを「データ隠蔽」と呼びます。プログラムの改修に備え、データ隠蔽を行うことで予期せぬ変更を未然に防ぐことができます。

学習時間

Java 1h

本日までの合計 196.5h

8/18 インスタンスとは

インスタンスとは、設計図であるクラスを元にして生成されたオブジェクト(物体)のことです。

Javaはまずクラスを設計し、クラスからインスタンスを生成します。生成したインスタンスを動作させることで、プログラムが動作します。クラスはあくまで設計図ですので、プログラムを動作させるためには設計図を元に物体を生成し、動作させる必要があります。このクラスを元に生成された物体がインスタンスです。

クラスは設計図ですので、1つのクラスを元に複数のインスタンスを生成することができます。それぞれのインスタンスは独立しているため、インスタンスごとに異なる値を保持させることが可能です。

なお、「オブジェクト」という場合、このインスタンスを指すことが多いですが、広い意味でとらえると設計図も「オブジェクト」ですので、クラスとインスタンスの両方を指して使う場合もあります。

学習時間

Java 1.5h

本日までの合計 195.5h

8/11~8/17 一週間まとめ

これまでのアウトプットは学習中に気になったことについて調べてまとめるといった内容が中心となっていましたが、今週からこれまで学んだプログラミングに関する用語のまとめを中心に取り組んでいます。これは聞かれたときに答えられるようにするためであり、将来的にチームで開発するためでもあります。

ひとりで開発をするのであれば、あいまいな知識であってもとりあえず使えれば進めてしまえますが、チームで開発をするのであれば、他の方の話す内容をきちんと理解できなければいけません。また、将来的に自身が教える立場となれば、聞かれたことにきちんと答えられなければいけません。

ですので、今後のアウトプットとしては、こうしたプログラミングに関する用語や知識についてのまとめを中心に取り組んでいきたいと思います。

次週の目標
  • 学習してきた用語のまとめに取り組む

8/17 mainメソッドとは

mainメソッドとは、プログラムを実行する際に最初に呼び出されるメソッドです。

Javaはまずクラスを設計し、クラスからインスタンスを生成します。生成したインスタンスを動作させることで、プログラムが動作します。このときクラスはあくまで設計図ですので、最初のインスタンスを生成するために、どのメソッドから処理を始めるかが決まっていなくてはいけません。この最初に呼び出されるメソッドのことをエントリーポイントといい、Javaではmainメソッドのことを指します。

mainメソッドにはいくつかのルールがあります。それはpublicであること、staticであること、voidであること、メソッド名はmainであること、そしてString配列型の引数を1つ受け取ることです。実際のプログラムではpublic static void main(String[] args)と記述します。

なお、引数名は慣習としてarguments(引数)の略称であるargsが採用されています。他の引数と同じように、変数の命名規則に従ってさえいれば自由に変更することもできます。

学習時間

Java 2h

本日までの合計 194h

8/16 フィールド、メソッドとは

フィールドとは、各インスタンスが保持すべき情報のことを指します。メソッドとは、そのフィールドの値を利用して行うべき処理のことを指します。Javaのクラスはこれらフィールドとメソッドの2つで構成されています。

Javaはまずクラスを設計し、そのクラスからインスタンスを生成します。そして生成したインスタンスを動作させることで、Javaのプログラムはさまざまな処理を実行していきます。このインスタンスの設計図となるクラスには、インスタンスが持つべきフィールドとメソッドが定義され、定義されたフィールドやメソッドの内容によって、どのようなオブジェクトが作り出されるのかが決まります。したがって、プログラムに目的の処理を行わせるためには、フィールドやメソッドの設計を正しく行う必要があります。

実際にどのような現実のモノがフィールドやメソッドに当てはまるかを見ていきます。たとえば電話のアドレス帳です。アドレス帳には、その連絡先の名前や電話番号といった必ず保持すべき情報があるはずです。プログラムではこの名前や電話番号などの保持すべき情報のことをフィールドとして扱います。そして、アドレス帳の名前や電話番号というのには、新しく登録をしたり、あるいは編集、削除をしたりといった必ず行うべき処理があるはずです。プログラムではこの登録、編集、削除などのフィールドの値を利用して行うべき処理のことをメソッドとして扱います。

なお、フィールドやメソッドのことをまとめて「メンバ」と呼びます。また、フィールドについては「メンバ変数」と呼ばれることもあります。

学習時間

Java 3.5h

本日までの合計 192h