💡 object expression
- 코틀린에서의 object는 최초 사용시, 호출하지 않아도 자동으로 인스턴스가 생성된다.
- 익명객체를 생성하여 인터페이스 객체를 쉽게 생성할 수 있다.
- 프로그램이 종료될 때까지 공통으로 사용될 메모리를 담기에 유용하다.
Singleton Pattern
보통 클래스를 사용하기 위해서는 클래스라는 설계도를 이용하여 인스턴스를 생성해야만 해당 클래스의 속성과 메소드를 사용할 수 있는데, 클래스에 대한 인스턴스를 한 개만 사용해야 하는 코드에서 object의 싱글톤 패턴을 구현한다. 싱글톤으로 생성된 인스턴스는 처음 한 번만 생성되며, 프로그램 전체에서 공동으로 사용된다.
익명객체를 사용한 인터페이스 객체 생성
안드로이드 앱개발을 하다보면 주로 리스너를 사용할 때 object를 많이 사용한다.
아래 코드를 보면 리스너 함수를 호출할 때 익명객체인 object를 파라미터로 넣어 사용하고 있다. object를 사용하지 않을 때는 해당 메소드에 파라미터로 리스너 형식을 넣기 위해 직접 리스너 인터페이스를 상속하는 등 코드가 좀 더 복잡해지고 길어지겠지만, 코틀린에서는 object라는 간편한 방법이 있으므로 그럴 필요가 없음!
currentUserDB.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
TODO("Not yet implemented")
}
override fun onCancelled(error: DatabaseError) {
TODO("Not yet implemented")
}
})
따라서 우리는 익명객체를 통해 인터페이스 객체를 코드 중간에 손쉽게 생성하여 바로 오버라이드하면 되는 것이다.
Companion Object
object와 companion object(동반 객체)의 차이점은 뭘까? companion object는 클래스 내에서 사용할 수 있는 키워드이다. 클래스 내부에 있는 companion object는 별도의 생성자 없이 클래스 이름을 통해 호출할 수 있다. 마치 자바의 static 변수처럼
fun main() {
val a = Vote("kkk")
val b = Vote("hhh")
a.addVote() //kkk에게 투표
a.addVote() //kkk에게 투표
b.addVote() //hhh에게 투표
println("총 접속자 수는 ${Vote.total}명") //Vote.total = 3
}
class Vote(val userName: String) {
companion object {
var total = 0
}
#
fun addVote() {
var name = userName
println("${name}에게 투표")
total++
}
}
위 코드를 보면 같은 클래스에서 서로 다른 인스턴스를 생성했음에도, companion object 내에 있는 변수는 모든 인스턴스에서 공통으로 사용되는 것을 볼 수가 있다. 이러한 companion object는 클래스 당 한 개만 가질 수 있으며, 모든 인스턴스가 공유할 수 있는 변수를 지정하고 싶을 때 사용된다. (정말 자바의 static 기능과 유사해 보인다
'Kotlin' 카테고리의 다른 글
[Kotlin] Coroutine 동시성 프로그래밍 개념 이해 (1) | 2023.11.07 |
---|