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 20require(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
doneinit에서 유효성 검사를 수행하면 규칙을 데이터 가까이에 둘 수 있습니다. 인스턴스를 받는 코드는 다시 확인하지 않고도 해당 인스턴스를 신뢰할 수 있습니다.
class Email(val address: String) {
init {
require("@" in address) { "not an email: $address" }
}
}
fun send(to: Email) { /* 주소를 다시 확인할 필요가 없다 */ }챌린지
쉬움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)
}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Kotlin 플레이그라운드