728x90
실드 클래스 ( Sealed Class )
실드 클래스는 다음과 같은 특성을 지닌다.
-
추상클래스와 같기 때문에 객체를 생성할 수 없다
-
생성자는 private 이여야만 한다.
-
실드 클래스는 같은 파일 안에서만 상속이 가능하다.
-
블록 안에 선언되는 클래스는 상속이 필요한 경우 open 키워드로 선언될 수 있다.
sealed class Result {
open class Success(val message: String) : Result()
class Error(val code: Int, val message: String) : Result()
}
class Status : Result()
class Inside : Result.Success("Status")
fun eval(result: Result): String = when (result) {
is Status -> "in progress"
is Result.Success -> result.message
is Result.Error -> result.message
}
fun main() {
val result = Result.Success("Good")
val msg = eval(result)
println(msg)
}
실드 클래스는 손 쉽게 생각해서 클래스의 집합체라고 보면 편할 것이다.
16줄에 result가 Success 클래스로 들어가고 eval 매소드에서 Success 클래스이므로 11번째 줄이 실행이 되면
16줄에 2번 줄 코드 message = Good 이므로 결과 값은 Good 일 것이다.
이처럼 sealed 클래스는 eval 매소드 처럼 when 이랑 같이 쓰인다.
열거형 클래스 ( Enum Class )
열거형 클래스는 여러개의 상수를 선언하고 열거된 값을 조건에 따라 선택할수 있는 클래스이다.
enum class Brush(var prio:Int) {
THIN(4), // 상수1(값),
NORMAL(5), // 상수2(값),
THICK(6); // 상수3(값);
}
fun main() {
println(Brush.THIN.prio)
println(Brush.NORMAL.prio)
println(Brush.THICK.prio)
println(Brush.THIN)
println(Brush.NORMAL)
println(Brush.THICK)
}
/*
4
5
6
THIN
NORMAL
THICK
*/
enum 클래스를 가장 쉽게 표현한 코드가 위에 코드이다. 상수에 따라서 prio 값이 바뀐다. 그리고 상수 자체를 출력할 수 있다.
만약 enum 클래스와 인터페이스가 만나면 어떻게 구현될까?
interface Score {
fun getScore(): Int
}
enum class MemberType(var prio: String) : Score {
NORMAL("Third") {
override fun getScore() = 100
},
SILVER("Second") {
override fun getScore() = 500
},
GOLD("First") {
override fun getScore() = 1500
};
}
fun main() {
println("|" + MemberType.NORMAL.getScore() + "|" + MemberType.SILVER.getScore() +
"|" + MemberType.GOLD.getScore())
println("|" + MemberType.NORMAL + "|" + MemberType.SILVER + "|" + MemberType.GOLD)
println("|" + MemberType.NORMAL.prio + "|" + MemberType.SILVER.prio +
"|" + MemberType.GOLD.prio)
}
/*
|100|500|1500
|NORMAL|SILVER|GOLD
|Third|Second|First
*/
다음과 같이 모든 상수에 인터페이스의 매소드를 override 해야 한다.
enum 클래스는 다음과 같은 특성을 갖는다.
-
클래스를 상속 받을 수 없고 상속 할 수도 없다.
728x90
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] 제네릭 / Generic (0) | 2020.03.19 |
---|---|
[Kotlin] 연산자 오버로딩 (0) | 2020.03.18 |
[Kotlin] 내부 클래스(1) (0) | 2020.03.15 |
[Kotlin] 데이터 클래스 (0) | 2020.03.15 |
[Kotlin] 인터페이스 (0) | 2020.03.14 |