tonykang22 / study

0 stars 0 forks source link

[Kotlin & Spring] 03. 싱글톤과 동반객체 #112

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

싱글톤과 동반객체

싱글톤


다양한 구현 방법들


자바에서 많이 쓰이는 구현 방식

public class Java_Singleton {

    private static final Java_Singleton INSTANCE = new Java_Singleton();

    private Java_Singleton() {
        /* do nothing */
    }

    public Java_Singleton getInstance() {
        return INSTANCE;
    } 

}


public class Java_Singleton {

    private Java_Singleton() {
        /* do nothing */
    }

    public Java_Singleton getInstance() {
        return LazyHolder.INSTANCE;
    }

    private static class LazyHolder {
        private static final Java_Singleton INSTANCE = new Java_Singleton();
    } 

}



코틀린의 싱글톤

object Singleton {
}


object Singleton {
    val a = 1234

    fun printA() = println(a)
}

fun main() {
    println(Singleton.a)
    Singleton.printA()
}


import java.time.LocalDateTime

object DatetimeUtils {

    val now: LocalDateTime
        get() = LocalDateTime.now()

    const val DEFAULT_FORMAT = "YYYY-MM-DD"

    fun same(a: LocalDateTime, b: LocalDateTime) :Boolean {
        return a == b
    } 
}

fun main() {
  println(DatetimeUtils.now) // 2022-05-23T22:42:52.186117
  println(DatetimeUtils.now) // 2022-05-23T22:42:52.189968
  println(DatetimeUtils.now) // 2022-05-23T22:42:52.190034

  println(DatetimeUtils.DEFAULT_FORMAT) // YYYY-MM-DD

  val now = LocalDateTime.now()
  println(DatetimeUtils.same(now, now)) // true
}



동반객체

class MyClass {

  companion object {

  } 
}


class MyClass {

    private constructor()

    companion object  {
        val a = 1234

        fun newInstance() = MyClass()
    }
}

fun main() {
    println(MyClass.a)
    println(MyClass.newInstance())

    // 아래와 같이도 사용은 가능하지만 생략 가능
    println(MyClass.Companion.a)
    println(MyClass.Companion.newInstance())
}


class MyClass {

    companion object MyCompanion {
        val a = 1234

        fun newInstance() = MyClass()
    }
}

fun main() {
    // MyCompanion은 생략 가능
    println(MyClass.MyCompanion.a)
    println(MyClass.MyCompanion.newInstance())
}