익명 객체와 객체 식
객체 식으로 인터페이스의 일회성 구현을 만들어 보세요.
익명 객체와 객체 식은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
객체 표현식
객체 표현식은 클래스나 인터페이스의 익명 일회성 인스턴스를 생성합니다. Java의 익명 내부 클래스에 해당하지만 더 강력합니다.
익명으로 인터페이스 구현하기
object : Interface { ... }를 사용하면 인라인 구현을 생성할 수 있습니다.
interface ClickListener {
fun onClick(): String
}
fun main() {
val listener = object : ClickListener {
override fun onClick() = "clicked!"
}
println(listener.onClick())
}상태를 가진 익명 클래스
익명 객체는 상태를 보유하고 여러 메서드를 가질 수 있습니다.
fun main() {
val counter = object {
var count = 0
fun inc() { count++ }
fun show() = println("count = $count")
}
counter.inc(); counter.inc(); counter.inc()
counter.show()
}익명 객체의 타입
익명 객체의 타입은 추론됩니다. 함수 수준에서 선언하면 사용자 정의 멤버에도 계속 접근할 수 있습니다.
fun main() {
val pair = object {
val left = "L"
val right = "R"
}
println("${pair.left} and ${pair.right}")
}익명 타입 노출
익명 객체를 추론된 타입으로 함수에서 반환하면 호출자는 상위 타입만 볼 수 있으므로, 익명 객체에 추가된 요소에는 외부에서 접근할 수 없습니다.
fun makeListener() = object {
fun greet() = "hello"
}
fun main() {
val l = makeListener()
println(l.greet()) // OK — same compilation unit
}여러 인터페이스
익명 객체 하나가 하나의 표현식에서 여러 인터페이스를 구현할 수 있습니다.
interface Closeable { fun close() }
interface Flushable { fun flush() }
fun main() {
val resource = object : Closeable, Flushable {
override fun close() = println("closed")
override fun flush() = println("flushed")
}
resource.flush()
resource.close()
}클래스 확장하기
익명 객체는 상속 가능한 클래스를 확장하면서 멤버를 재정의할 수 있습니다.
open class Animal(val name: String) {
open fun speak() = "$name makes a sound"
}
fun main() {
val pet = object : Animal("Rex") {
override fun speak() = "$name barks!"
}
println(pet.speak())
}둘러싼 변수 캡처
익명 객체는 둘러싼 범위의 변수를 캡처하여 읽고 수정할 수 있습니다. Java에서 final이 필요하다는 요구 사항과는 다릅니다.
fun main() {
var log = mutableListOf<String>()
val recorder = object {
fun record(s: String) { log.add(s) }
}
recorder.record("event 1")
recorder.record("event 2")
println(log)
}익명 객체를 사용할 때
자체 클래스를 만들 정도는 아닌 일회성 구현에 익명 객체를 사용합니다. 일반적으로 콜백, 리스너, 비교기 등에 활용합니다.
fun main() {
val nums = listOf(3, 1, 4, 1, 5, 9, 2, 6)
val sorted = nums.sortedWith(object : Comparator<Int> {
override fun compare(a: Int, b: Int) = b - a // descending
})
println(sorted)
}가능하면 람다 우선
인터페이스에 단일 추상 메서드(SAM)만 있다면 객체 표현식보다 람다가 더 간결합니다.
fun main() {
val nums = listOf(3, 1, 4, 1, 5, 9)
// Old way:
val sorted1 = nums.sortedWith(object : Comparator<Int> {
override fun compare(a: Int, b: Int) = b - a
})
// New way — SAM conversion:
val sorted2 = nums.sortedWith(Comparator { a, b -> b - a })
println("$sorted1 / $sorted2")
}익명 객체와 선언된 객체
이름 있는 싱글턴에는 object Name을 사용합니다. 일회성 익명 인스턴스에는 표현식에서 object : Type을 사용합니다.
// Named singleton (one instance, accessed globally)
object GlobalLogger { fun log(m: String) = println("[L] $m") }
// Anonymous (created at expression evaluation)
fun main() {
val local = object { fun hi() = "hi" }
GlobalLogger.log("hello")
println(local.hi())
}빠른 확인
인터페이스를 인라인으로 구현하는 익명 인스턴스를 생성하는 구문은 무엇인가요?
요약
객체 표현식은 인라인으로 일회성 익명 인스턴스를 생성합니다. 인터페이스를 구현하고, 클래스를 확장하며, 상태를 보유하고, 둘러싼 변수를 캡처할 수 있습니다. 단일 메서드 인터페이스에는 람다를 우선하고, 여러 메서드나 상태가 필요할 때 객체 표현식을 사용합니다.
자주 묻는 질문
“익명 객체와 객체 식” 강의는 무료인가요?
네 — “익명 객체와 객체 식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“익명 객체와 객체 식”에서 뭘 배우나요?
객체 식으로 인터페이스의 일회성 구현을 만들어 보세요. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“익명 객체와 객체 식” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- object 선언: Kotlin 싱글턴
- companion object: Kotlin의 정적 멤버와 유사한 요소
- 익명 객체와 객체 식
- companion object를 사용한 팩토리 메서드