クラス

Scalaのオブジェクト指向プログラミング(OOP)における「クラス(class)」は、データ(フィールド)と動作(メソッド)をひとまとまりにして定義するための基本構造です。Scalaはオブジェクト指向と関数型の両方の特徴を持っていますが、クラスはOOPにおける中核的な役割を担っています。


1. クラスの定義

クラスはclassキーワードを使って定義します。次に、基本的なクラス定義の例を示します:

scala
class Person(val name: String, var age: Int) { def greet(): Unit = { println(s"こんにちは、私は$name、$age歳です。") } }

説明

  • name: valで宣言されており、読み取り専用

  • age: varで宣言されており、読み書き可能

  • greet: メソッド。インスタンスが自身の情報を出力する処理を行う。


2. クラスのインスタンス化

クラスからオブジェクトを生成するにはnewキーワードを使います(ただし、主コンストラクタだけの場合は省略可能):

scala
val person1 = new Person("山田太郎", 30) person1.greet()

3. コンストラクタ

Scalaでは、クラスの定義時に渡される引数が主コンストラクタになります。加えて、def this(...) を使って補助コンストラクタ(auxiliary constructor)も定義できます:

scala
class Book(val title: String, val author: String) { def this(title: String) = this(title, "著者不明") }

4. メソッドとフィールド

クラス内では、以下の要素を定義できます:

  • フィールドvalvar

  • メソッドdef

  • ネストされたクラスやオブジェクト

  • 初期化コード(主コンストラクタ内に記述)


5. 継承

Scalaのクラスは他のクラスをextendsで継承することができます:

scala
class Animal { def speak(): Unit = println("動物の鳴き声") } class Dog extends Animal { override def speak(): Unit = println("ワンワン") }
  • overrideキーワードは、親クラスのメソッドをオーバーライドする際に必須です。


6. アクセス修飾子

Scalaには以下のアクセス制御があります:

  • public(省略可能):全ての場所からアクセス可能。

  • private:同じクラス内のみアクセス可能。

  • protected:同じクラスとそのサブクラスからアクセス可能。


7. 抽象クラス

クラスの一部を未実装として定義したい場合、abstract classを使います:

scala
abstract class Shape { def area: Double // 実装なし }

抽象クラスはインスタンス化できず、継承して具体的な実装を与える必要があります。


まとめ

Scalaにおけるクラスは、以下のような特徴を持つ重要な構造です:

機能 説明
フィールドとメソッド データと処理をひとつにまとめる
コンストラクタ 主と補助の2種類が存在
継承 extendsにより親クラスの機能を引き継ぐ
抽象クラス インタフェース的な使い方が可能
アクセス制御 privateprotectedなどで制限可能

Scalaのクラスは、Javaと似た構文を持ちながらも、Scalaの関数型機能と統合されているため、柔軟で強力な設計が可能です。

生成日:2025/05/04