무명 객체와 객체 선언 모두 object 키워드를 사용하는데 어떻게 구별할까?
무명 객체(object expression)
식이 실행될 때마다 새로운 객체 인스턴스가 생성
fun main() {
// 무명 객체를 사용하여 Runnable 인터페이스 구현 (인터페이스나 클래스를 상속 or 구현)
val runnable = object : Runnable {
override fun run() {
println("Runnable is running")
}
}
// 무명 객체의 run 메서드 호출
runnable.run() // 새로운 인스턴스 생성
}
// 단순한 익명 객체 생성
val obj = object {
val property = "Hello"
fun greet() = println(property)
}
객체 선언
싱글턴 패턴으로 동작하며, 프로그램 전체에서 단 하나의 인스턴스만 생성
object MySingleton : Runnable {
override fun run() {
println("Hello from singleton object")
}
}
fun main() {
MySingleton.run() // "Hello from singleton object" 출력
MySingleton.run() // 동일한 인스턴스에서 호출됨
}
람다와 무명 객체 차이 1
무명 객체는 object 키워드를 사용하기도 하지만, 람다는 람다 내부에서 외부 변수를 사용하지 않는 경우, 람다는 오로지 자신의 코드만으로 동작하여 동일 인스턴스를 재사용할 수 있다(단, 외부 변수 캡처 시 인스턴스를 동일하게 계속 생성할 수도 있음).
fun executeRunnable(runnable: Runnable) {
runnable.run()
}
fun main() {
// 람다를 전달: 최적화되어 재사용될 가능성 있음.
executeRunnable(Runnable { println("Lambda execution") })
// 무명 객체를 전달: 매 호출 시마다 새로운 인스턴스 생성
executeRunnable(object : Runnable {
override fun run() {
println("Anonymous object execution")
}
})
// 다시 무명 객체 전달: 또 다른 인스턴스 생성됨
executeRunnable(object : Runnable {
override fun run() {
println("Anonymous object execution again")
}
})
}
람다와 무명 객체 차이 2
람다에는 무명 객체와 달리 인스턴스 자신을 가리키는 this가 없다. 다라서 람다를 변환한 무명 클래스의 인스턴스를 참조할 방법이 없다. 컴파일러 입장에서 보면 람다는 코드 블록일 뿐이고, 객체가 아니므로 객체처럼 람다를 참조할 수는 없다. 람다 안에서 this는 그 람다를 둘러싼 클래스의 인스턴스를 가리킨다.
'Kotlin' 카테고리의 다른 글
[Kotlin] @JvmName (0) | 2025.03.20 |
---|---|
[Kotlin in Action] 5.4 자바 함수형 인터페이스 활용 (0) | 2025.03.19 |
[Kotlin in Action] 5.3. 지연 계산(lazy) 컬렉션 연산 (0) | 2025.03.19 |
[Kotlin in Action] 5.2 컬렉션 함수형 API (0) | 2025.03.18 |
[Kotlin in Action] 5.1 람다 식과 멤버 참조 (0) | 2025.03.18 |
댓글