📝

📝 期末試験まとめ - データ構造とアルゴリズム(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メソッド ユーティリティ用、インターフェース名で呼び出し

📌 実装による効果

  1. 実装の強制
  2. 多態的参照が可能
  3. 接着剤として、上位型での統一的なアクセスが可能
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 関係
使用目的 状態と機能の共有 多機能の結合、役割の分離

実用例:
クラスCAB両方の機能を継承したい場合にインターフェースの多重実装を使用


✅ 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