객체 표현식
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 } // 람다 형태챌린지
쉬움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("; "))
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Kotlin 플레이그라운드