개발(Android)/android studio

[Android Studio/Kotlin] Singleton Pattern

shinyelee 2022. 4. 20. 21:36

[안드로이드 스튜디오/코틀린] 싱글톤/싱글턴 패턴

MainActivity.kt

package com.shinyelee.android_study2

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast

// 메인화면
class MainActivity : AppCompatActivity() {

    val TAG: String = "로그"

    // 뷰 생성
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 그릴 xml 뷰 파일을 연결(설정) 시켜줌
        setContentView(R.layout.activity_main)
        Log.d(TAG, "MainActivity - onCreate() called")

        // 일반 클래스
        val myNormalClass1 = MyNormalClass()
        val myNormalClass2 = MyNormalClass()
        // 메모리 2개
        Log.d(TAG, "MainActivity - myNormalClass1 : $myNormalClass1")
        Log.d(TAG, "MainActivity - myNormalClass2 : $myNormalClass2")

        // 싱글턴 클래스
        val mySingletonClass1 = MySingletonClass
        val mySingletonClass2 = MySingletonClass
        // 메모리 1개
        Log.d(TAG, "MainActivity - mySingletonClass1 : $mySingletonClass1")
        Log.d(TAG, "MainActivity - mySingletonClass2 : $mySingletonClass2")

        // 매개변수 있는 클래스
        val mySQLOpenHelper1 = MySQLOpenHelper(this)
        val mySQLOpenHelper2 = MySQLOpenHelper(this)
        // 메모리 2개
        Log.d(TAG, "MainActivity - mySQLOpenHelper1 : $mySQLOpenHelper1")
        Log.d(TAG, "MainActivity - mySQLOpenHelper2 : $mySQLOpenHelper2")

        // 매개변수 있는 클래스를 싱글턴으로
        val mySQLOpenHelperSingleton1 = MySQLOpenHelperSingleton.getInstance(this)
        val mySQLOpenHelperSingleton2 = MySQLOpenHelperSingleton.getInstance(this)
        // 메모리 2개
        Log.d(TAG, "MainActivity - mySQLOpenHelperSingleton1 : $mySQLOpenHelperSingleton1")
        Log.d(TAG, "MainActivity - mySQLOpenHelperSingleton2 : $mySQLOpenHelperSingleton2")

    }

}

MyNormalClass.kt

package com.shinyelee.android_study2

class MyNormalClass {

    init {
    }
    
}

myNormalClass1과 myNormalClass2는 다름(각각 메모리 사용)


MySingletonClass.kt

package com.shinyelee.android_study2

object MySingletonClass {
}

mySingletonClass1과 mySingletonClass2는 같다(메모리 하나 사용)


MySQLOpenHelper.kt

package com.shinyelee.android_study2

import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper

class MySQLOpenHelper(context: Context): SQLiteOpenHelper(context, "MyDB", null, 1) {

    val TAG: String = "로그"

    override fun onCreate(p0: SQLiteDatabase?) {
    }

    override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) {
    }

}

mySQLOpenHelper1과 mySQLOpenHelper2는 다름


MySQLOpenHelperSingleton.kt

package com.shinyelee.android_study2

import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper

class MySQLOpenHelperSingleton private constructor(context: Context): SQLiteOpenHelper(context, "MyDB", null, 1) {

    val TAG: String = "로그"

    companion object {

        // 자기 자신을 변수 선언
        @Volatile private var instance: MySQLOpenHelperSingleton? = null

        // 자기 자신 가져오기
        fun getInstance(context: Context): MySQLOpenHelperSingleton =
            instance ?: synchronized(this) {
                instance ?: MySQLOpenHelperSingleton(context).also {
                    instance = it
                }
            }
    }

    override fun onCreate(p0: SQLiteDatabase?) {
    }

    override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) {
    }

}

mySQLOpenHelperSingleton1과 mySQLOpenHelperSingleton2는 같다

 

[Kotlin syntax] Objects

[코틀린 문법] 오브젝트 Object(객체), Singleton Pattern(싱글톤/싱글턴 패턴) // Object(오브젝트) // // 객체를 한 개만 생성하도록 하며 전역으로 생성 가능 // 하나의 객체로 공통적인 속성과 함수를 사

shinye0213.tistory.com


참고

반응형