/* 본 게시물은 ' Do it 코틀린 프로그래밍 | with 황영덕 ' 의 내용을 토대로 작성되었습니다. */
#실드 클래스 / 열거 클래스
1. 실드 클래스
실드란 '봉인된'이라는 의미로 무언가 안전하게 보관하기 위해 묶어 두는 것을 뜻한다. 실드 클래스는 미리 만들어 놓은 자료형들을 묶어서 제공하기 때문에 어떤 의미에서는 열거형 클래스의 확장으로도 볼 수 있다.
실드 클래스는 sealed 키워드를 통해 선언할 수 있다. 실드 클래스 그 자체는 추상 클래스와 같기 때문에 객체를 만들 수 없다. (즉, 껍데기? 라고 생각하면 된다.) 또한 생성자도 기본적으로 private 이며 private이 아닌 생성자는 허용하지 않는다. 실드 클래스는 같은 파일 안에서는 상속이 가능하지만, 다른 파일에서는 상속이 불가능하게 제한된다. 블록 안에 선언되는 클래스는 상속이 필요한 경우 open 키워드로 선언될 수 있다. 실드 클래스를 사용해보자.
sealed class Result { // 실드 클래스를 선언
open class Success(val message: String): Result()
class Error(val code: Int, val message: String): Result()
}
//Result() 객체를 상속받지만 쉴드만 가지고 있어 의미 x
class Status: Result() // 실드 클래스 상속은 같은 파일에서만 가능
class Inside: Result.Success("Status") // 내부 클래스 상속
//class ErrorText: Result.Error(1,"hello") Error class 에 open 키워드가 없으므로 상속 불가능
fun main() {
//Success 객체 생성
val result = Result.Success("Good")
val msg = eval(result)
println(msg)
val result2 = Inside()
val msg2 = eval(result2)
println(msg2)
val result3 = Status()
val msg3 = eval(result3)
println(msg3)
val result4 = Result.Error(1, "hello")
val msg4 = eval(result4)
println(msg4)
}
fun eval(result: Result): String = when(result){
is Status -> "Status 객체"
is Result.Success -> "[Success] ${result.message}"
is Result.Error -> "[Error] ${result.message}"
}
실행 결과
위 예제는 성공/실패를 Result 라는 실드 클래스로 감쌌다. 실드 클래스에서 특정 객체 자료형에 따라 when 문과 is 를 사용해 결과값에 따라 실행이 가능하다. 이렇게 모든 경우 Success / Error 가 열거 되있으므로 else 문이 필요 없다. 이는 실드 클래스를 사용했기 때문이다. (일반적으로 when 문을 사용할 때 컴파일러는 모든 경우의 수를 판단할 수 없기 때문에 else 문을 써야한다.)
2. 열거 클래스
열거형 클래스란 여러 개의 상수를 선언하고 열거된 값을 조건에 따라 선택할 수 있는 클래스이다. 열거형 클래스는 실드 클래스와 비슷하다. 차이점은 열거형 클래스는 실드 클래스처럼 다양한 자료형을 다루지 못한다. 열거형 클래스는 enum 키워드를 사용해서 선언한다. 열거형 클래스를 사용해보자.
enum class Day(val num: Int){
MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4),
FRIDAY(5), SATURDAY(6), SUNDAY(7)
}
fun main() {
val day = Day.FRIDAY
when (day.num){
1,2,3,4,5 -> println("평일")
6,7 -> println("주말")
}
when(day){
Day.MONDAY -> println("월요일")
Day.TUESDAY -> println("화요일")
Day.WEDNESDAY -> println("수요일")
Day.THURSDAY -> println("목요일")
Day.FRIDAY -> println("금요일")
Day.SATURDAY -> println("토요일")
Day.SUNDAY -> println("일요일")
}
}
실행 결과