📝
📝 期末試験まとめ - データ構造とアルゴリズム(2025年度 前期)
🧠 データ構造およびアルゴリズム - 期末試験まとめ(2025年度 前期)
✅ 1. 抽象クラス(Abstract Class)
📌 基本概念
- 抽象クラスは未完成 + 強制性を持つクラス
- 直接インスタンス化はできない
- 1つ以上の抽象メソッドを含み、サブクラスで必ずオーバーライドする必要がある
📌 コード例
abstract class Animal {
abstract void sound();
}
class Dog extends Animal {
void sound() {
System.out.println("ワンワン");
}
}
📌 多態性との関連
- 多態性により、上位型として下位オブジェクトを制御可能
Animal a = new Dog();
a.sound(); // ワンワン
- 多態性がないと、抽象クラスの強制性と未完成性は意味が薄れる
📌 活用目的
- コードの再利用性、柔軟な設計
- ストラテジーパターンなどで頻繁に使用される
✅ 2. インターフェース(Interface)
📌 概念
- インターフェースはオブジェクト間の**動作の約束(接着剤)**の役割
- 実装クラスに動作の強制を行う
📌 構成要素と特徴
| 要素 | 特徴・目的 |
|---|---|
| 抽象メソッド | 実装の強制、宣言のみ存在 |
| 定数 | public static final、共通定数定義 |
| defaultメソッド | 基本実装提供、オーバーライドは任意 |
| staticメソッド | ユーティリティ用、インターフェース名で呼び出し |
📌 実装による効果
- 実装の強制
- 多態的参照が可能
- 接着剤として、上位型での統一的なアクセスが可能
interface Drawable {
void draw();
}
class Circle implements Drawable {
public void draw() {
System.out.println("円を描く");
}
}
Drawable d = new Circle();
d.draw();
📌 多重継承の例
interface A { void a(); }
interface B { void b(); }
interface C extends A, B {
void c();
}
📌 抽象クラスとの比較
| 項目 | 抽象クラス | インターフェース |
|---|---|---|
| 役割 | 共通実装の継承 | 機能仕様の提供 |
| 概念 | is-a 関係 | can-do 関係 |
| 使用目的 | 状態と機能の共有 | 多機能の結合、役割の分離 |
実用例:
クラスCがAとB両方の機能を継承したい場合にインターフェースの多重実装を使用
✅ 3. 例外処理(Exception Handling)
📌 例外の分類
-
Checked Exception:コンパイル時に処理が強制される(例:
IOException) -
Unchecked Exception:実行時に発生し、処理は任意(例:
NullPointerException)
📌 try-catch-finally 構造
try {
FileInputStream f = new FileInputStream("a.txt");
int a = 10 / 0;
} catch (FileNotFoundException e) {
System.out.println("ファイルが見つかりません");
} catch (ArithmeticException e) {
System.out.println("0で割り算しました");
} finally {
System.out.println("常に実行されます");
}
-
try: 例外が発生しうるコード領域 -
catch: 例外ごとに処理(2つ以上のcatch節で条件満たす) -
finally: 必ず実行される
📌 例外の委譲(throws)とオーバーライド制限
class FileProcessor {
void readFile() throws IOException {
FileReader fr = new FileReader("data.txt");
}
}
-
throws: 呼び出し元に例外を委ねる
class Parent {
void work() throws IOException {}
}
class Child extends Parent {
void work() throws FileNotFoundException {} // OK
// void work() throws SQLException {} // ❌ コンパイルエラー
}
- オーバーライド時、親クラスより広い範囲の例外は宣言不可
- 理由:多態的環境では親クラスの型で例外処理するため、安全性が求められる
📌 throw キーワード
if (x < 0) {
throw new IllegalArgumentException("負の値は不可");
}
- 開発者が明示的に例外を発生させる
- JVMが例外オブジェクトをスタックに積み、例外処理ルートへ移動
Discussion