2024. 3. 14. 09:30, ๐ฑAndroid Study
๋ฐ์ํ
์ฑ๊ธํค ๊ฐ๋
- ํ๋ก๊ทธ๋จ ์์๊ณผ ์ข ๋ฃ๊น์ง ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋จ ํ ๋ฒ๋ง ์์ฑํ์ฌ ์ฌ์ฉํ๋ ํจํด
- ํ๋ก๊ทธ๋จ ์ ์ญ์์, ์ด ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๋ฉฐ ์ฌ์ฉํ ์ ์๊ฒ๋ ํ๋ ๊ฒ
- ์ฝํ๋ฆฐ์ companion, object ํค์๋๋ก ์ฑ๊ธํด์ ๊ตฌํ
์ฑ๊ธํค ํจํด ์ฌ์ฉ ์ด์
- ํ๋ก๊ทธ๋จ์์ ํค๋ณด๋ ๊ฐ์ฒด๋ฅผ ๋ฌดํํ๊ฒ ์ ์ํ๋ค๋ฉด? → ์ ๋ ฅ์์๊ฐ ๊ผฌ์
- ์ ๋ ๊ฑด ์์ง๋ง, ์ค๋ณต๋ ๋์์ ํ๋ ๊ฐ์ฒด๋ฅผ ๊ทธ ๋๋ง๋ค ์์ฑ์ํค๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ญ๋น๋จ
- ๋ณดํต ๊ฐ์ฒด๋ ์์์ด ๊ฐ๋ฅํ ๋งํผ ์์ฑํ ์ ์๊ณ , ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ ์์ดํ ์์น์ ๋ณด/๊ณ ์ ํ ์ ์ฅ๊ฐ์ ์ง๋
- ์ฑ๊ธํด์ ํ์ฉํ๋ฉด ํด๋น ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ ์ ์ญ์์ ์ ์ผํจ์ ๋ณด์ฅํ๊ณ ์์น์ ๋ณด๊ฐ ๊ณ ์
- ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ๋ก ๋ก๋ํด์ ์์น๋ฅผ ์ก์
- ๊ฐ์ฒด ์์๊ฐ์ ์ถฉ๋ ๋ฐฉ์ง, ์ ์ญ์ ์ผ๋ก ํ์ฉํ์ฌ ๋ค๋ฅธ ํด๋์ค๋ค์์ ์ฝ๊ฒ ์ ๊ทผ, ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ์ฉ
์ฑ๊ธํค ์์
// ์์ฑ์ ํธ์ถ X
// ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ํด๋์ค ์ ๋ณด์ ์ ๊ทผํ ์ ์์
fun main() {
Bird.fly("์ฐธ์") // ์ฑ๊ธํค ํจํด
}
object Bird {
fun fly(name:String) {
println("${name}๊ฐ ๋ ์์~")
}
}
// ์์ฑ์ ํธ์ถ O
// ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ํด๋์ค ์ ๋ณด์ ์ ๊ทผํ ์ ์์
fun main() {
// trash์ ๊ฐ์ด ์์ฑ์์ ๋งค๊ฐ๋ณ์ ์ ๋ฌ ๊ฐ๋ฅ
var singletonObject1 = MySingletonClass.getInstance(trash = 1)
singletonObject1.setNum(5)
println("num๊ฐ์: ${singletonObject1.getNum()}")
// singletonObject2์์ num์ 10์ผ๋ก ๋์
var singletonObject2 = MySingletonClass.getInstance(trash = 1)
singletonObject2.setNum(10)
// singletonObject1์ num์ด 10์ผ๋ก ์ถ๋ ฅ๋จ
// singletonObject1๊ณผ singletonObject2๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ
println("num๊ฐ์: ${singletonObject1.getNum()}")
}
class MySingletonClass private constructor() {
private var num:Int = 0
companion object {
@Volatile private var instance: MySingletonClass? = null
private var trash = 0
fun getInstance(trash: Int): MySingletonClass {
this.trash = trash
// ์ธ๋ถ์์ ์์ฒญ์์๋ instance๊ฐ null์ธ์ง ๊ฒ์ฆ
if(instance == null) {
// synchronized๋ก ์ธ๋ถ ์ฐ๋ ๋์ ์ ๊ทผ์ ๋ง์
// ์ฐ๋ ๋๊ฐ์ ๊ฐ์ฒด์ํ ํผ๋์ ๋ง๊ธฐ์ํด ์ฌ์ฉ
synchronized(this) {
instance = MySingletonClass()
}
}
return instance!!
// ์๋น์ค์ฐ์ฐ์, scope function ์ฌ์ฉ
// return instance ?: synchronized(this) {
// // also๋ ํธ์ถํ ๊ฐ์ฒด๋ฅผ it์ผ๋ก ๋๊น
// // instance๊ฐ null์ด๋ผ๋ฉด ์๋ก ์์ฑํ๊ณ ์๋๋ฉด ๋ฌด์ํจ
// instance ?: MySigletonClass().also {
// instance = it
// }
// }
}
}
fun setNum(num: Int) {
this.num = num
}
fun getNum(): Int{
return this.num
}
}
์ฝํ๋ฆฐ์์์ ์ฑ๊ธํค
object SingletonObj {
}
- ์ฝํ๋ฆฐ์์ object(์๋ฐ์์์ static) ๋ก ํด๋์ค๋ฅผ ์ ์ํ๊ฒ ๋๋ฉด, ํด๋์ค๋ฅผ ์ ์ํ๋ ๋์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉฐ
- ์ด ๋, ๋ฌด์กฐ๊ฑด ๋จ์ผ ์ธ์คํด์ค ์์ฑ์ ๋ณด์ฅํจ
- ์ด ํด๋์ค ์์ ํ์ํ ๊ฐ์ฒด, ๋ฉ์๋ ๋ฑ์ ์ ์ํด๋๋ฉด ํ๋ก๊ทธ๋จ ์ ์ญ์์ ์ด๋ฅผ ํ์ฉํ ์ ์์
- ๋ค์ํ ์ ์ฝ ์กฐ๊ฑด(๋ฉํฐ ์ฐ๋ ๋ฉ ํ๊ฒฝ ๋ฑ) ์ ๊ณ ๋ คํ ํ์ ์์ด, Thread-safe ํ๊ณ Lazyํ ์ด๊ธฐํ๋ฅผ ์ธ์ด ์ฐจ์์์ ์ง์
๋ฐ์ํ
๐ฌ C O M M E N T