728x90

Object

 

object 키워드를 써서 특별한 단일 인스턴스를 만들 수 있다.  싱글톤(singleton) 패턴 인스턴스를 의미한다.

  • 싱글톤을 쉽게 만들 수 있는 키워드  
  • 여러 스레드에서 동시에 사용하려고 하더라도 딱 하나의 인스턴스만 생성된다.
  • 생성자 사용불가
  • 프로퍼티, 메서드, 초기화 블록은 사용 가능 
  • 클래스를 정의함과 동시에 객체를 생성한다. 

Object 식

 

object 식을 활용해서 속성들을 담고 있는 오브젝트를 쉽게 만들 수 있으며, 이렇게 간단히 할 때는 클래스를 선언할 필요 없이 오브젝트를 하나 만들어서 그 안에 멤버들을 선언해 두고 접근해 쓸 수 있다.

fun main() {
    rentPrice(10, 2, 1)
}

fun rentPrice(standardDays: Int, festivityDays: Int, specialDays: Int){

    val dayRates = object {
        var standard: Int = 30 * standardDays
        var festivity: Int = 50 * festivityDays
        var special: Int = 100 * specialDays
    }

    val total = dayRates.standard + dayRates.festivity + dayRates.special

    print("Total price: $$total") //Total price: $500 //함수호출 해당오브젝트 생성
}

 

 

Object 단일 인스턴스

 

object 선언을 할 수도 있다. 식의 형태가 아니라면, 변수에 값을 대입하는 용도로 쓸 수 없다. 별도의 인스턴스를 만들지 않고, 해당 오브젝트의 멤버에 곧바로 접근할 수 있다.

fun main() {
    println(Counter.count)    /*최초 초기화       생성 시점에 최초 초기화
                                0*/          
    Counter.countUp()           
    Counter.countUp()
    println(Counter.count)     //2 
}

object Counter{
    init {
        println("최초 초기화")
    }
    var count = 0
    fun countUp(){
        count++
    }
}

 

싱글톤으로 생성하면 객체를 한 번만 생성해서 계속 사용하기 때문에 초기화는 한번만 진행 됨 (값 공유)

(만약 class로 만들었다면 각각 다른 객체가 생성됨)

다른 클래스나 인터페이스도 상속가능하다.

Object는 안드로이드에서 에러코드를  정의할 때 많이 사용 

 

 

Companion Objects (동반 객체)

클래스 정의 안쪽에 선언하는 동반 오브젝트(객체)를 만들 수 있다. 문법적으로 자바의 정적(static) 메서드와 비슷하게 클래스 이름을 통해서 해당 오브젝트 멤버에 접근할 수 있다.

  • Java의 static 과 동일한 역할
  • 클래스 내에 하나만 생성할 수 있음
fun main() {
    Book.NAME       //인스턴스를 만들지 않아도 변수나 상수에 접근가능
    Book.create()  //인스턴스를 아직 만들지 않아도 클래스 메소드처럼 사용가능
}

class Book{
    companion object{
        const val NAME = "name"
        fun create() = Book()
    }
}

자바의 static 과 동일하기 때문에 인스턴스를 만들지 않아도 메소드나 프로퍼티에 바로 접근이 가능하다.  

+ Recent posts