Menu
Coddy logo textTech

객체 표현식

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

객체 표현식은 필요한 위치에서 이름 없는 클래스의 일회성 객체를 생성합니다. object : Type { ... }와 같이 작성하며, 일반적으로 인터페이스를 구현합니다. 인터페이스는 메서드가 어떻게 작동하는지는 설명하지 않고 메서드를 나열합니다. 인터페이스에 대해서는 5장에서 자세히 다룹니다.

interface Greeter {
    fun greet(name: String): String
}

main 내부에서:

val polite = object : Greeter {
    override fun greet(name: String) = "Good morning, $name."
}
println(polite.greet("Ada"))

출력:

Good morning, Ada.

객체 선언은 한 번만 존재합니다. 객체 표현식은 해당 코드가 실행될 때마다 평가되며, 실행할 때마다 새로운 객체가 생성됩니다. 객체 표현식은 주변의 지역 변수를 읽고 변경할 수 있습니다:

interface Counter {
    fun next(): Int
}

fun counterFrom(start: Int): Counter {
    var current = start
    return object : Counter {
        override fun next() = current++
    }
}

main 내부에서:

val a = counterFrom(10)
val b = counterFrom(1)
println("${a.next()} ${a.next()} ${b.next()}")

출력:

10 11 1

일반적인 사용 사례는 동작을 라이브러리 함수에 전달하는 것입니다. sortedWith는 Comparator를 받습니다. 이는 compare(a, b) 메서드가 a가 먼저 와야 할 때 음수를, 동률일 때 0을, 그 외의 경우 양수를 반환하는 인터페이스입니다:

main 내부:

val words = listOf("kiwi", "fig", "banana", "apple")
val byLength = object : Comparator<String> {
    override fun compare(a: String, b: String) = a.length - b.length
}
println(words.sortedWith(byLength))

출력:

[fig, kiwi, apple, banana]

상위 타입이 없는 객체 표현식은 몇 가지 값을 지역 객체로 묶으며, 그 속성은 같은 함수 내부에서 사용할 수 있습니다. 인터페이스에 메서드가 하나만 있을 때는 람다가 객체 표현식보다 더 짧은 경우가 많습니다. 여러 메서드가 있거나 유지해야 할 상태가 있을 때 객체 표현식이 적합합니다.

val size = object {
    val width = 3
    val height = 4
}
println(size.width * size.height)                    // 12

val byLength = Comparator<String> { a, b -> a.length - b.length }   // 람다 형태
challenge icon

챌린지

쉬움

Validator 인터페이스에는 하나의 메서드 check(text)가 있으며, 텍스트가 조건을 통과하면 오류 메시지 또는 null을 반환합니다. 객체 표현식으로 생성된 세 개의 검증기를 다음 순서로 반환하도록 rules(minLength) 함수를 완성하세요. 텍스트는 최소 minLength개의 문자를 포함해야 하고(too short), 숫자를 포함해야 하며(needs a digit), 공백을 포함하지 않아야 합니다(no spaces allowed).

제공된 코드는 최소 길이를 읽은 다음 한 줄에 하나씩 비밀번호를 읽습니다. ok를 출력하거나, 해당 비밀번호의 모든 오류 메시지를 ; 로 연결하여 출력합니다.

코드는 Rules.kt와 Validator.kt에 작성하세요. Main.kt에는 제공된 입력/출력 코드가 포함되어 있으며 수정할 수 없습니다.

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    val checks = rules(input[0].toInt())
    for (password in input.drop(1)) {
        val problems = checks.mapNotNull { it.check(password) }
        println(if (problems.isEmpty()) "ok" else problems.joinToString("; "))
    }
}
quiz icon실력 점검

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

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

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