こんにちは!運営者のハックです。
今回は「Javaコース初級 基礎編Day13『クラス、インターフェース、メソッド、継承、多態性』」の学習再挑戦について紹介します。
基礎編の中で「最も難しい」内容
今回の講義では特にマインクラフトで実装するものはありませんが、具体的にコードを書かないために理解するのが難しい項目でもあります。
再挑戦の今回は初回では深堀できなかった各項目について自習しましたので紹介します。
今回は説明が長く内容も難しめだから、読むのが面倒くさくなったら赤太字だけ注目してほしいのにゃ!
クラスとメソッドの関係
クラスとメソッドは、プログラムの基本的な構成要素であり、現実世界の概念や行動をコードの中で表現するためのツールです。クラスは「何ができるか」を定義し、メソッドはその「具体的な実行方法」を提供します。以下に具体的な例を挙げます。
クラスの役割
クラスは、「設計図」のようなものです。例えば、家を建てる際の設計図と同様に、クラスでは何ができるか(機能)と何を知っているか(情報)を定義します。
例えば「猫」クラスは、猫に関する一般的な情報やできることを定義した設計図です。この設計図には、猫が持つべき情報(属性)と、猫ができる行動(メソッド)が含まれます。
- 属性の例: 名前、年齢、毛色など
- メソッドの例: 鳴く、飛び跳ねる、眠るなど
メソッドの役割
メソッドは、クラス内に定義される「行動」や「動作」です。クラスが設計図であるならば、メソッドはその設計図に基づいて実際に何かを「する」ための指示書です。
猫の例で言えば「鳴く」という行動がメソッドにあたります。メソッドを使うことで、猫が鳴く様子をプログラム内で再現することができます。
- 「鳴く」(猫が「うにゃあ」と音を出す)
- 「飛び跳ねる」(喜びを表現する動作)
- 「眠る」(猫が目を閉じて休む)
このようにクラスとメソッドを使用することで、プログラム内で猫という具体的な概念を模倣し、猫が実際に行う行動をシミュレートすることができます。
単一責任の法則(Single Responsibility Principle, SRP)
クラスにおける単一責任の法則とは、ソフトウェア設計の原則の一つで、「一つのクラスは一つの責任だけを持つべき」という考え方です。つまり、あるクラスが変更される理由は一つだけであるべき、ということです。
この原則に従うことで、ソフトウェアをより理解しやすく(保守性)、メンテナンスしやすく(テスト容易性)、そして再利用しやすく(再利用性)なります。
例えば、ユーザー情報を扱うクラスがあり、そのクラスでユーザーのデータをデータベースに保存する処理と、ユーザー情報を画面に表示する処理の両方を行っている場合、そのクラスは二つの責任を持っています。
単一責任の法則に従うと、データ保存と画面表示は別々のクラスに分割して管理するべきです。
これにより、ユーザー情報の表示方法を変更したい場合でも、データベースへの保存処理に影響を与えることなく変更できるようになります。
アクセス修飾子
アクセス修飾子は、クラスやメソッド、変数のアクセス範囲を制限するために使われます。パブリック(public)とプライベート(private)はその中でも最も基本的な2つです。
public
パブリック(public)は、どこからでもアクセス可能な範囲を指します。
つまり、パブリックに設定されたメソッドや変数は、同じプログラム内のどのクラスからもアクセスすることができます。
publicは、他のクラスとの間で共有したい機能やデータに使います。
private
プライベート(private)は、その変数やメソッドが宣言されているクラス内からのみアクセス可能な範囲を指します。つまり、プライベートに設定されたメソッドや変数は、他のクラスからは直接アクセスすることができません。クラスの内部処理やデータを隠蔽(カプセル化)し、外部からの不正なアクセスを防ぐために使います。
パッケージプライベート(デフォルトアクセス修飾子)
パッケージプライベートは、特に何も指定しないときのアクセスレベルです。
これを使うと、その部品(クラスやメソッドなど)は、同じ「フォルダ」内の他の部品からは見えますが、違う「フォルダ」にあるものからは見えなくなります。つまり、自分が属する「グループ」内では自由に使い回せますが、「グループ」の外にはその存在を隠します。
この「フォルダ」とは、プログラミングの世界で「パッケージ」と呼ばれるもので、関連する部品をまとめて整理するために使います。
具体的なコードの例を挙げます。
package mypackage;
class PackagePrivateClass {
void packagePrivateMethod() {
System.out.println("このメソッドはパッケージ内からのみアクセス可能です。");
}
}
このPackagePrivateClassクラスとpackagePrivateMethodメソッドには、アクセス修飾子が指定されていません。このため、これらはパッケージプライベートのアクセスレベルを持ち、mypackageパッケージ内の他のクラスからはアクセスできますが、それ以外のパッケージからはアクセスできません。これがパッケージプライベートの特徴で、同じパッケージ内のクラス間でのみアクセスが可能になるというものです。
クラスの継承
クラスの継承とは、あるクラスが他のクラスの特性(プロパティやメソッド)を引き継ぐ仕組みのことを指します。これにより、コードの再利用性が高まり、プログラムの構造をより簡潔に、理解しやすくできます。
オーバーライド(Override)
オーバーライドは継承の中で発生する特定の動作の一つであり、子クラスが親クラスから継承したメソッドを新しい振る舞いで再定義することです。
オーバーライドされたメソッドは、メソッドのシグネチャ(メソッド名とパラメータの型)が親クラスのものと完全に一致していなければなりませんが、その内部の実装は異なることができます。これにより、継承したクラスの振る舞いをカスタマイズできます。
具体的なコードの例を挙げます。
class Animal {
void makeSound() {
System.out.println("動物が鳴く");
}
}
class Cat extends Animal {
// オーバーライド
void makeSound() {
System.out.println("にゃあ");
}
}
AnimalクラスにはmakeSoundメソッドが定義されており、「動物が鳴く」と出力します。CatクラスはAnimalクラスを継承していて、makeSoundメソッドをオーバーライドしています。これは、CatクラスのインスタンスがmakeSoundメソッドを呼び出すと、「にゃあ」と出力することを意味します。オーバーライドにより、親クラスで定義された振る舞いを子クラスでカスタマイズできます。
「オーバーライド」と似た言葉で「オーバーロード」という概念があります。オーバーライドとは異なり、オーバーロードはクラスの継承とは直接関連しない概念であり、メソッドの引数を変更することによって、同じ名前のメソッドを同一クラス内に複数持つことを意味します。
抽象メソッド(abstractメソッド)
抽象メソッド(abstractメソッド)は、具体的な実装が記述されていないメソッドのことを指します。抽象メソッドは、実装の詳細を省略して「このメソッドはあるけれど、何をするかはサブクラスで決めてね」という契約を表します。抽象メソッドを含むクラスは抽象クラスと呼ばれ、このクラス自体は直接インスタンス化(オブジェクト化)できません。
例えば、動物園のアプリケーションを作っていて、全ての動物が「鳴く」という共通の行動を持つけど、その鳴き方は動物によって違うとします。そこで、AnimalクラスにmakeSoundという抽象メソッドを定義して、各動物がどのように鳴くかはその動物のクラス(DogやCatなど)で具体的に定義します。
具体的なコードの例を挙げます。…同じセリフ3連続ですね。
abstract class Animal {
// 抽象メソッド。具体的な実装はサブクラスに任せる
abstract void makeSound();
}
class Dog extends Animal {
@Override
void makeSound() {
// 犬の鳴き声を具体的に実装
System.out.println("ワンワン");
}
}
class Cat extends Animal {
@Override
void makeSound() {
// 猫の鳴き声を具体的に実装
System.out.println("ニャーニャー");
}
}
このように抽象メソッドを使うことで、「何かをする」という共通の行動を定義しつつも、その「何か」の具体的な内容をサブクラスに委ねることができます。これにより、コードの再利用性や拡張性が向上します。
多様性(ポリモーフィズム)とインターフェイス
Javaではインターフェイスを用いて多様性(ポリモーフィズム)を実現しています。
Javaのオブジェクト指向プログラミングでは、インターフェイスと多様性(ポリモーフィズム)がコードの再利用性、拡張性、メンテナンス性を高めるために重要な役割を果たします。
インターフェイス
インターフェイスは、クラスが実装すべきメソッドを定義するフレームワークであり、クラスに特定のメソッドを実装するように強制するための契約のようなものです。具体的な実装を持たず、どのようなメソッドが必要かだけを示します。
例として、Animalというインターフェイスがあり、この中でmakeSoundというメソッドが定義されているとしましょう。ここで、DogとCatの二つのクラスがAnimalインターフェイスを実装するとします。それぞれのクラスでは、makeSoundメソッドをオーバーライドして、「犬はワンワン」と「猫はニャーニャー」という鳴き声を出力するように実装します。
これにより、異なる種類の動物がそれぞれ独自の鳴き声を出すことができるようになります。
多様性(ポリモーフィズム)
多様性、またはポリモーフィズムとは、異なるデータタイプに対して同一のインターフェースを提供する能力です。
例えば、「鳴く」という行動をするAnimalクラスがあり、そのサブクラスにDogとCatがある場合、Dogは「ワン」と鳴き、Catは「ニャー」と鳴きますが、これらは「鳴く」という同じ行動に対して異なる結果を示す例です。
この性質により、コードの柔軟性と再利用性が高まります。
多様性は異なるクラスのオブジェクトが同一のインターフェースに従って操作される能力を示し、インターフェイスはその共通の操作を定義するためのメカニズムを提供します。
まとめ 理解度50%くらいにはなったかな?
今回は「クラス、インターフェース、メソッド、継承、多態性」について、それぞれ内容を自習しました。
講義では、今の段階だと理解度は10%程度でいいので、これからコードを書いて覚えてくださいとのことでした。
中級編が終わっており、かつ今回の自習で理解度が50%程度まで上がった気がしますが、後は自力でコードを書いていく内に習得するしかないと思います。
以上で今回の学習記録を終えます。
ここまでご覧いただきありがとうございました。
コメント