[Kotlin] 싱글턴 패턴 & Object 설명 & 예제

728x90

Object

  • 기존의 Class 객체는 단지 인스턴스 객체를 만들기 위한 '틀' 이기 때문에
    내부에 있는 속성이나 함수를 사용하려면 var a = Person("박서준",1992) 와 같은 생성자를 통해 실제가 되는 인스턴스 객체를 만들어야 했었음

  • 여러개의 인스턴스가 필요하지 않으며, 단하나의 객체만으로 공통적인 속성과 함수를 사용해야 하는 코드에서는 굳이 Class를 쓸 필요 없이 Object 를 사용하면 된다.

Singleton Pattern 싱글턴 패턴

클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍쳐 패턴
코틀린은 이 싱글턴 패턴을 언어차원에서 지원한다.

fun main() {
    //참조 연산자 사용하지 않고 직접 쓴다
    println(Counter.count)

    Counter.countUp()
    Counter.countUp()

    println(Counter.count)

    Counter.clear()

    println(Counter.count)
}

//example : 코드 아무 곳에서나 호출하여 counting 하는 Counter object
//인스턴스를 생성하지 않고 그 자체로 객체이다 -> 클래스와 다른 점(생성자 사용하지 않는다)
object Counter {
    //초기값
    var count = 0

    fun countUp() {
        count++
    }

    fun clear() {
        count = 0
    }
}

 

  • Object로 선언된 객체는 '최초 사용시' 자동으로 생성되며 이후에는 코드 전체에서 공용으로 사용될 수 있으므로 프로그램이 종료되기 전까지 공통적으로 사용할 내용들을 묶어 만드는게 좋다.

Companion Object

기존의 클래스에 만드는 Object
클래스의 인스턴스 기능은 그대로 유지하면서

인스턴스간에 사용할 공용 속성 및 함수

별도로 만드는 기능

기능적으로는 기존의 언어의 Static 멤버와 비슷
Staitc : 클래스 내부에서 별도의 영역에 고정적으로 존재하여
인스턴스를 생성하지 않아도 공용으로 사용가능한 속성이나 함수

fun main() {
    var a = FoodPoll("짜장")
    var b = FoodPoll("짬뽕")

    a.vote()
    a.vote()

    b.vote()
    b.vote()
    b.vote()

    println("${a.name} : ${a.count}")
    println("${b.name} : ${b.count}")
    println("총계 : ${FoodPoll.total}")

}

class FoodPoll(val name: String) {
    companion object {
        //전체 투표수
        var total = 0
    }

    //개별 투표수
    var count = 0

    fun vote() {
        total++
        count++
    }
}

 

728x90

댓글

Designed by JB FACTORY