Kotlinのクラスとオブジェクト指向の基本をマスターする【Kotlin入門④】

クラスとは?

Kotlinのクラスは、オブジェクト指向プログラミングの基盤となる概念です。クラスを利用することで、データとその振る舞いをまとめて扱うことができ、コードの再利用性や保守性が向上します。

クラスの基本構文

Kotlinでは、classキーワードを使ってクラスを定義します。

class Person(val name: String, var age: Int) {
    fun introduce() {
        println("My name is $name and I am $age years old.")
    }
}

fun main() {
    val person = Person("Alice", 25)
    person.introduce()
}

この例では、Personクラスにname(読み取り専用)とage(変更可能)というプロパティを定義し、introduceメソッドを持たせています。

コンストラクタ

Kotlinのクラスには主コンストラクタ(Primary Constructor)と副コンストラクタ(Secondary Constructor)があります。

主コンストラクタ

主コンストラクタは、クラス名の後に直接定義されます。

class Car(val model: String, val year: Int)

fun main() {
    val myCar = Car("Toyota", 2022)
    println("Model: ${myCar.model}, Year: ${myCar.year}")
}

副コンストラクタ

副コンストラクタは、constructorキーワードを使って定義します。

class Animal {
    var name: String
    var age: Int
    
    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }
}

fun main() {
    val dog = Animal("Buddy", 3)
    println("Animal: ${dog.name}, Age: ${dog.age}")
}

副コンストラクタを使うことで、複数の初期化方法を持たせることができます。

プロパティとアクセサ

プロパティのカスタムアクセサ

Kotlinでは、プロパティにカスタムゲッターやセッターを定義することができます。

class User(val firstName: String, val lastName: String) {
    val fullName: String
        get() = "$firstName $lastName"
}

fun main() {
    val user = User("John", "Doe")
    println(user.fullName) // 出力: John Doe
}

継承と抽象クラス

クラスの継承

Kotlinのクラスはデフォルトでfinalであり、継承可能にするにはopenキーワードを付ける必要があります。

open class Animal(val name: String) {
    open fun makeSound() {
        println("Some generic animal sound")
    }
}

class Dog(name: String) : Animal(name) {
    override fun makeSound() {
        println("Woof Woof!")
    }
}

fun main() {
    val dog = Dog("Buddy")
    dog.makeSound() // 出力: Woof Woof!
}

抽象クラス

abstractキーワードを使うと、インスタンス化できない抽象クラスを定義できます。

abstract class Vehicle(val name: String) {
    abstract fun move()
}

class Car(name: String) : Vehicle(name) {
    override fun move() {
        println("$name is driving on the road")
    }
}

fun main() {
    val car = Car("Tesla")
    car.move()
}

インターフェース

Kotlinのインターフェースは、クラスに複数の機能を持たせるために使用されます。

interface Drivable {
    fun drive()
}

class Bicycle : Drivable {
    override fun drive() {
        println("Bicycle is moving")
    }
}

fun main() {
    val bike = Bicycle()
    bike.drive()
}

インターフェースには、デフォルトの実装を含めることもできます。

interface Movable {
    fun move() {
        println("Moving...")
    }
}

class Robot : Movable

fun main() {
    val robot = Robot()
    robot.move() // 出力: Moving...
}

データクラス

データクラスは、主にデータを保持するためのクラスで、dataキーワードを使って定義します。

data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person("Alice", 30)
    val person2 = Person("Alice", 30)
    println(person1 == person2) // 出力: true
}

データクラスはequalshashCodetoStringなどのメソッドが自動的に生成されます。

シングルトンとオブジェクト

Kotlinではobjectキーワードを使うことで、シングルトンパターンを簡単に実装できます。

object Database {
    fun connect() {
        println("Connected to database")
    }
}

fun main() {
    Database.connect()
}

まとめ

本記事では、Kotlinのクラスとオブジェクト指向の基本について解説しました。Kotlinのクラスを活用することで、コードをより構造的に整理し、再利用しやすくなります。