디자인 패턴을 kotlin으로 써 보았다 Singleton 편

「Java 언어로 배우는 디자인 패턴 입문」 에 대해 배우고 자바와 함께 kotlin으로 작성해보기로 결정했습니다.
이번에는 Singleton에 대해 정리합니다.

※또, 코멘트란에 리뷰를 받았습니다 @sdkei 씨 감사합니다.
리뷰를 바탕으로 수정했습니다 내용을 반영 했으므로, 그 점도 근거로 써 가려고 생각합니다.

Singleton이란?



singleton이란 요소를 하나만 갖고 있는 집합을 가리키는 말로 아래 역할을 하는 패턴으로 정의되어 있습니다.
  • 지정된 클래스의 인스턴스가 절대적으로 1 개 밖에 없는 것을 보증하고 싶다
  • 인스턴스가 하나만 존재한다는 것을 프로그램에서 표현하고 싶습니다.

    Singleton 클래스



    이 클래스에서는 static 필드로서 정의된 singleton 멤버에 Singleton 클래스의 인스턴스로 초기화하고 있습니다만, 클래스의 로드시에 한 번만 초기화가 행해집니다.
    또, private로 외부로부터의 액세스를 막는 것으로 인스턴스가 1개 밖에 생성되지 않는 것을 보증하고 있다는 것.

    kotlin의 경우 static이라는 정의는 없으며 대신 companion object를 정의합니다.

    참고 : Kotlin에서 static 멤버를 어떻게 써야 하나요?

    또, companion object 를 정의해 디컴파일하면 Companion 객체를 개입시킨 getter/setter로부터 액세스 하게 되므로 const인가 @JvmField 를 사용한다고 하는 것.
    그러나 const는 프리미티브형이나 String형만이므로 비프리미티브형은 @JvmField을 지정하고, 프리미티브형을 @JvmField 지정하면 2회 초기값을 대입하기 위해 구분할 필요가 있다는 것.
    단, @JvmField 는 Field에 가시성을 가지기 위해서 사용하기 때문에, 이번 private에서는 사용할 수 없었다.

    참고:
    【Kotlin】 【Java】 Kotlin Java 비교 메모
    Calling Kotlin from Java

    추가 사항 : @sdkei 님 리뷰 감사합니다!
    리뷰를 받고, 위와 같은 구현이 아니어도 Kotlin에는 객체 선언을 사용해 보다 용이하게 구현할 수 있게 되어 있다고 하는 것입니다.
    Singleton2.kt , SingletonSample2.kt
    참고:
    Kotlin에서 디자인 패턴 Singleton 편
    객체 표현 및 선언

    Singleton.java
    class Singleton {
        private static Singleton singleton = new Singleton();
        private Singleton() {
            System.out.println("インスタンスを生成しました。");
        }
        public static Singleton getInstance() {
            return singleton;
        }
    }
    

    Singleton.kt
    class Singleton {
        init { println("インスタンスを生成しました。") }
        companion object {
           private val singleton = Singleton()
           fun getInstance() = this.singleton
        }
    }
    

    Singleton2.kt
    object Singleton {
        init { println("インスタンスを生成しました。") }
    }
    

    Main 클래스



    SingletonSample.java
    public class SingletonSample {
        public static void main(String[] args) {
            System.out.println("Start.");
            Singleton s1 = Singleton.getInstance();
            Singleton s2 = Singleton.getInstance();
            if (s1 == s2) {
                System.out.println("s1とs2は同じインスタンスです。");
            } else {
                System.out.println("s1とs2は同じインスタンスではありません。");
            }
            System.out.println("End.");
        }
    }
    

    SingletonSample.kt
    fun main(args: Array<String>) {
        println("Start.")
        val s1 = Singleton.getInstance()
        val s2 = Singleton.getInstance()
        if (s1 == s2) println("s1とs2は同じインスタンスです。")
        else println("s1とs2は同じインスタンスではありません。")
        println("End.")
    }
    

    SingletonSample2.kt
    fun main(args: Array<String>) {
        println("Start.")
        val s1 = Singleton
        val s2 = Singleton
        if (s1 == s2) println("s1とs2は同じインスタンスです。")
        else println("s1とs2は同じインスタンスではありません。")
        println("End.")
    }
    

    실행 결과
    Start.
    インスタンスを生成しました。
    s1とs2は同じインスタンスです。
    End.
    

    클래스 다이어그램





    소감


  • static 의 필드로서 정의되었다 배웠다.
  • 또한, 상기 보증에 의해, 시리얼 넘버 등의 일의일 필요가 있는 실장시에 메리트가 되는 것을 배웠다.
  • Kotlin에 대해서는 다음 사항을 배울 수 있었다
  • static 대신에 singleton 를 정의한다
  • companion내에서 프리미티브형과 String형은 companion object {} , 비프리미티브형은 const
  • private의 경우 그대로 사용
  • 객체 선언을 통해 Singleton 패턴을 쉽게 사용할 수 있습니다

  • 참고



    아래를 참고로 하겠습니다. 매우 읽기 쉽고 이해하기 쉬웠습니다.

    Kotlin에서 static 멤버를 어떻게 써야 하나요?
    【Kotlin】 【Java】 Kotlin Java 비교 메모
    Calling Kotlin from Java
    Kotlin에서 디자인 패턴 Singleton 편
    객체 표현 및 선언

    좋은 웹페이지 즐겨찾기