Kotlin

[Kotlin] Object 키워드 / 싱글톤 패턴 (Singleton pattern)

실버☆ 2022. 3. 28. 16:59

 

💡 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