이번 학습 주제는 지난 학습에서 미처 하지 못한
코틀린의 sealed class와 추상 클래스 및 인터페이스입니다
지난 학습에서 enum 클래스에 대해 살펴보았습니다
지난 학습 주제가 궁금하시다면 ↓↓↓
2020/05/04 - [Android] - [Android] 코틀린(Kotlin) 다른 타입의 클래스(Class)
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)와 일반 함수를 모두 가질 수 있다는 점입니다
추상 함수는 헤더만 선언하고 몸체의 구현 코드가 없는 함수를 말합니다
이것으로 오늘의 학습을 마치겠습니다
그럼 이만-_-
'Android' 카테고리의 다른 글
[Android] 코틀린(Kotlin)의 실체화(Reification)와 확장(Extension) (0) | 2020.06.07 |
---|---|
[Android] 코틀린(Kotlin) 제네릭(Generic) (0) | 2020.05.17 |
[Android] 코틀린(Kotlin) 다른 타입의 클래스(Class) (0) | 2020.05.04 |
[Android] 코틀린(Kotlin) 클래스(Class)의 상속(Inheritance)와 타입(Type) (0) | 2020.05.04 |
[Android] 코틀린(Kotlin) 클래스(Class) 생성과 초기화 (0) | 2020.05.04 |