본문 바로가기

Study/Kotlin Study

[Kotlin] 봉인된 클래스

+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.

enum 클래스

enum class Result {
    SUCCESS, ERROR
}

fun runComputation(): Result {
    val a = readLine()?.toIntOrNull() ?: return Result.ERROR
    val b = readLine()?.toIntOrNull() ?: return Result.ERROR

    println("Sum: ${a + b}")
    return Result.SUCCESS
}

fun main() {
    println(when (runComputation()) {
        Result.SUCCESS -> "Completed Successfully"
        Result.ERROR -> "Error!"
    })
}

상속을 통한 enum의 대체

상속을 통할 경우 변종별로 다른 특성을 반영할 수 있다.

 

import java.lang.Exception

abstract class Result {
    class Success(val value: Any) : Result() {
        fun showResult() {
            println(value)
        }
    }
    class Error(val message: String) : Result() {
        fun throwException() {
            throw Exception(message)
        }
    }
}

fun runComputation(): Result {
    val a = readLine()?.toIntOrNull() ?: return Result.Error("First argument is invalid")
    val b = readLine()?.toIntOrNull() ?: return Result.Error("Second argument is invalid")

    return Result.Success(a + b)
}

fun main() {
    println(when (val result = runComputation()) {
        is Result.Success -> "Completed Successfully ${result.value}"
        is Result.Error -> "Error! ${result.message}"
        else -> return // else가 들어가야 하는 것이 뭔가 이상함
    })
}

 


sealed class (봉인된 클래스)

상속하는 하위 클래스의 정의를 같은 파일 내부로 제한한다.

함부로 상속하여 해당 class의 완결성을 저해할 수 없도록 정의한다.

 

import java.lang.Exception

sealed class Result { // 내부에 정의된 두 클래스만 상속 받을 수 있다.
    class Success(val value: Any) : Result() {
        fun showResult() {
            println(value)
        }
    }
    class Error(val message: String) : Result() {
        fun throwException() {
            throw Exception(message)
        }
    }
}

fun runComputation(): Result {
    val a = readLine()?.toIntOrNull() ?: return Result.Error("First argument is invalid")
    val b = readLine()?.toIntOrNull() ?: return Result.Error("Second argument is invalid")

    return Result.Success(a + b)
}

fun main() {
    println(when (val result = runComputation()) {
        is Result.Success -> "Completed Successfully ${result.value}"
        is Result.Error -> "Error! ${result.message}"
        // result는 Result의 하위 클래스. 즉 무조건 Success 또는 Error 클래스이기 때문에 else를 사용하지 않아도 된다.
    })
}

+ 에디터 오류로 빨간 줄이 있을 수 있으나 컴파일은 가능하다.

'Study > Kotlin Study' 카테고리의 다른 글

[Kotlin] 컬렉션 유틸리티  (1) 2023.11.21
[Kotlin] 컬렉션 타입  (0) 2023.11.20
[Kotlin] 부호 없는 정수  (0) 2023.11.14
[Kotlin] data 클래스  (0) 2023.11.14
[Kotlin] enum 클래스  (1) 2023.11.13