Menu
Coddy logo textTech

init 블록과 유효성 검사

Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 4번째.

init 블록은 인스턴스가 생성될 때, 생성자 매개변수가 할당된 직후에 실행됩니다. 단일 프로퍼티 선언에 들어맞지 않는 설정 코드를 작성하는 곳입니다:

class Order(val id: Int, items: List<Int>) {
    val total: Int
    val count: Int

    init {
        total = items.sum()
        count = items.size
        println("created order $id")
    }
}

main 내부에서:

val o = Order(7, listOf(4, 6, 10))
println("${o.count} items, total ${o.total}")

출력:

created order 7
3 items, total 20

require(condition) { message }는 인수를 검사하고, 조건이 거짓일 때 메시지와 함께 IllegalArgumentException을 발생시킵니다. 이를 init에 넣으면 잘못된 인스턴스가 절대 생성될 수 없습니다:

class Percentage(val value: Int) {
    init {
        require(value in 0..100) { "percentage must be 0-100, was $value" }
    }
}

main 내부:

println(Percentage(42).value)
try {
    Percentage(150)
} catch (e: IllegalArgumentException) {
    println(e.message)
}

출력:

42
percentage must be 0-100, was 150

클래스에는 여러 init 블록이 있을 수 있습니다. 이러한 블록은 프로퍼티 초기화 코드와 함께 위에서 아래 순서로 실행됩니다:

class Demo(name: String) {
    val first = "first: $name".also { println(it) }

    init { println("init 1") }

    val second = "second".also { println(it) }

    init { println("init 2") }
}

main 내부에서:

Demo("x")
println("done")

출력:

first: x
init 1
second
init 2
done

init에서 유효성 검사를 수행하면 규칙을 데이터 가까이에 둘 수 있습니다. 인스턴스를 받는 코드는 다시 확인하지 않고도 해당 인스턴스를 신뢰할 수 있습니다.

class Email(val address: String) {
    init {
        require("@" in address) { "not an email: $address" }
    }
}
fun send(to: Email) { /* 주소를 다시 확인할 필요가 없다 */ }
challenge icon

챌린지

쉬움

Password 클래스를 완성하세요. init 블록은 require를 사용하여 텍스트에 최소 8개의 문자가 있는지(메시지 too short)와 숫자가 포함되어 있는지(메시지 needs a digit)를 이 순서대로 확인합니다. strength 프로퍼티는 init에서 계산됩니다. 텍스트에 대문자도 포함되어 있으면 strong이고, 그렇지 않으면 ok입니다.

제공된 코드는 각 입력 줄에 대해 Password를 생성하고 strength 또는 오류 메시지를 출력합니다.

코드는 Password.kt에 작성하세요. Main.kt에는 제공된 입력/출력 코드가 있으며 편집할 수 없습니다.

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    for (line in input) {
        try {
            println(Password(line).strength)
        } catch (e: IllegalArgumentException) {
            println(e.message)
        }
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Kotlin 플레이그라운드