Android

[Android] 코틀린(Kotlin) sealed 클래스, 추상클래스, 인터페이스

구루싸 2020. 5. 8. 21:37
반응형
SMALL

이번 학습 주제는 지난 학습에서 미처 하지 못한

코틀린의 sealed class와 추상 클래스 및 인터페이스입니다

지난 학습에서 enum 클래스에 대해 살펴보았습니다

지난 학습 주제가 궁금하시다면 ↓

2020/05/04 - [Android] - [Android] 코틀린(Kotlin) 다른 타입의 클래스(Class)

 

[Android] 코틀린(Kotlin) 다른 타입의 클래스(Class)

지난 학습 주제는 코틀린 클래스의 상속과 타입이었습니다 아래에 클래스에 관한 지난 학습들의 링크를 걸어놓겠습니다 2020/05/04 - [Android] - [Android] 코틀린(Kotlin) 클래스(Class) 생성과 초기화 [Android..

yssa.tistory.com

enum 클래스는 ADT(Algebraic data type, 대수적 데이터 타입)의 간단한 형태인데

ADT는 지정된 타입과 연관될 수 있는 서브 타입들의

폐집합(closed set)을 나타낼 수 있고 이러한 타입들을 모두 처리했는지

컴파일러가 검사할 수 있다는 장점이 있습니다

class Student(var status: StudentStatus)

sealed class StudentStatus {
    object NotEnrolled: StudentStatus()
    class Active(val courseId: String): StudentStatus()
    object Graduated: StudentStatus()
}

fun studentMessage(status: StudentStatus): String {
    return when (status) {
        is StudentStatus.NotEnrolled -> "Register for the course"
        is StudentStatus.Active -> "Enrolled in ${status.courseId}"
        is StudentStatus.Graduated -> "Happy graduation"
    }
}
fun main(args: Array<String>) {
    val student1 = Student(StudentStatus.Active("Kotlin101"))
    val student2 = Student(StudentStatus.NotEnrolled)
    val student3 = Student(StudentStatus.Graduated)
    println(studentMessage(student1.status))
    println(studentMessage(student2.status))
    println(studentMessage(student3.status))
}

sealed 클래스와 enum 클래스는 비슷하지만

enum 클래스의 각 항목이 하나의 인스턴스만 생성되는 반면

sealed 클래스에 속하는 서브 클래스들은 일반 클래스이므로

인스턴스 개수에 제한이 없다는 차이가 있습니다

주목해야 할 점은 위의 코드에서

Student 클래스의 기본 생성자에 정의된

status 속성의 타입이 StudentStatus이고

Student 인스턴스를 생성할 때 Active 서브 클래스의 타입이

StudentStatus 타입으로 스마트 캐스팅된다는 점입니다

이유는 sealed 클래스인 StudentStatus가

Active의 슈퍼 클래스이기 때문입니다

package com.ros.sandbox

import java.util.*

interface Fightable {
    var healthPoints: Int
    val diceCount: Int
    val diceSides: Int
    val damageRoll: Int
        get() = (0 until diceCount).map {
            Random().nextInt(diceSides) + 1
        }.sum()
    /* abstract function */
    fun attack(opponent: Fightable): Int
}

abstract class Monster(val name: String,
                       val description: String,
                       override var healthPoints: Int) : Fightable {
    override fun attack(opponent: Fightable): Int {
        val damageDealt = damageRoll
        opponent.healthPoints -= damageDealt
        return damageDealt
    }
}

class Goblin(name: String = "Goblin",
             description: String = "Ugly Goblin",
             healthPoints: Int = 30): Monster(name, description, healthPoints) {
    override val diceCount = 2
    override val diceSides = 8
}

이번에는 인터페이스(interface)와 추상클래스(abstract class)를 보겠습니다

인터페이스를 사용하면 여러 클래스들의

공통적인 속성과 행동을 나타낼 수 있고

상속 관계가 없는 클래스들 간에 속성과 함수를 공유할 수 있습니다

추상 클래스는 인터페이스와 클래스의 특성을 혼합한 것입니다

인터페이스와의 차이점은 클래스이기 때문에

상속과 생성자를 가질 수 있다는 점과

추상 함수(abstract function)와 일반 함수를 모두 가질 수 있다는 점입니다

추상 함수는 헤더만 선언하고 몸체의 구현 코드가 없는 함수를 말합니다

이것으로 오늘의 학습을 마치겠습니다

그럼 이만-_-

 

반응형
LIST