๐ค ์ฑ๊ธํค ํจํด?
- ์ฑ๊ธํค ํจํด์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ฌ์ฉ๋๋ ๋์์ธ ํจํด ์ค ํ๋์ด๋ค.
- ์ด ํจํด์ ํน์ ํด๋์ค์ ์ธ์คํด์ค(๊ฐ์ฒด)๋ฅผ ์ค์ง ํ๋๋ง ์์ฑํ๋๋ก ๋ณด์ฅํ๋ค.
๋ฐ๋ผ์ ํด๋น ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ณณ์์ ๊ณต์ ํ์ฌ ์ฌ์ฉํ ์ ์๋ค. - ์๋๋ก์ด๋๋ Kotlin์์์ "๊ฐ์ฒดํ"๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ์๋ฏธํ๋ค. ์ฆ, ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ์ฌ ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋งํ๋ค. ์ด ๋, ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ค๋ฉด ํด๋น ํด๋์ค์ ๊ฐ์ฒด๋ ์ค์ง ํ ๋ฒ๋ง ์์ฑ๋๋ฉฐ, ์ดํ์๋ ์ด๋ฏธ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ณ์ํด์ ์ฌ์ฉํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ฌ๋ฌ ๊ณณ์์ ํด๋น ๊ฐ์ฒด๋ฅผ ํ์๋ก ํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ฏธ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
๐ฅ๏ธ ์ผ๋ฐ์ ์ธ ๊ตฌํ๊ณผ ์ฑ๊ธํค์ ์ฐจ์ด
์ฑ๊ธํค ๊ตฌํ O
object Singleton {
init {
println("Singleton instance created")
}
fun doSomething() {
println("Singleton is doing something")
}
}
fun main() {
// Singleton ๊ฐ์ฒด์ ์ ๊ทผ
Singleton.doSomething()
Singleton.doSomething()
}
// Singleton instance created
// Singleton is doing something
// Singleton is doing something
- ์ด ์ฝ๋์์๋ Singleton ํด๋์ค๊ฐ ์ฑ๊ธํค์ผ๋ก ์ ์๋์ด์๋ค.
- Singleton ํด๋์ค์ ์ธ์คํด์ค๋ object ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋์๋ค.
- main ํจ์์์ Singleton.doSomething()์ ๋ ๋ฒ ํธ์ถํ์ ๋, "Singleton instance created"๊ฐ ํ ๋ฒ๋ง ์ถ๋ ฅ๋๊ณ , "Singleton is doing something"์ ๋ ๋ฒ ์ถ๋ ฅ๋๋ค. ์ด๋ Singleton ํด๋์ค์ ์ธ์คํด์ค๊ฐ ํ ๋ฒ๋ง ์์ฑ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฑ๊ธํค ๊ตฌํ X
class NormalClass {
init {
println("NormalClass instance created")
}
fun doSomething() {
println("NormalClass is doing something")
}
}
fun main() {
// ๋ ๋ฒ์ ๊ฐ์ฒด ์์ฑ
val instance1 = NormalClass()
val instance2 = NormalClass()
instance1.doSomething()
instance2.doSomething()
}
// NormalClass instance created
// NormalClass instance created
// NormalClass is doing something
// NormalClass is doing something
- ์ฑ๊ธํค์ ๊ตฌํํ์ง ์๊ณ , ์ฌ๋ฌ ๋ฒ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ฝ๋์ด๋ค.
- ์ด ์ฝ๋์์๋ NormalClass๋ผ๋ ์ผ๋ฐ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ,
main ํจ์์์ ๋ ๋ฒ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ๊ฐ์ doSomething() ํจ์๋ฅผ ํธ์ถํ๋ค. - ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด "NormalClass instance created"๊ฐ ๋ ๋ฒ ์ถ๋ ฅ๋๊ณ ,
"NormalClass is doing something"๋ ๋ ๋ฒ ์ถ๋ ฅ๋๋ค. - ์ด๋ NormalClass์ ๊ฐ์ฒด๊ฐ ๋ ๋ฒ ์์ฑ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ ์์๋ฅผ ํตํด ์ฑ๊ธํค ํจํด๊ณผ ์ผ๋ฐ์ ์ธ ํด๋์ค์ ์ฐจ์ด๋ฅผ ํ์ธํ ์ ์๋ค.
๐ค object?
์ฝํ๋ฆฐ์์ ํด๋์ค๋ฅผ ์ ์ํ๋ ํค์๋๋ class์ด์ง๋ง, ๊ฐํน object ํค์๋๋ก ํด๋์ค ์ ์ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ณผ ์ ์๋ค. object๋ก ํด๋์ค๋ฅผ ์ ์ํ๋ฉด, ์ฑ๊ธํค(Singleton) ํจํด์ด ์ ์ฉ๋์ด ๊ฐ์ฒด๊ฐ ํ๋ฒ๋ง ์์ฑ๋๋๋ก ํ๋ค. ์๋ฐ์์๋ ์ฑ๊ธํค ํจํด์ ์ ์ฉํ๊ธฐ ์ํด ๊ฝค ๋ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ง๋ง, ์ฝํ๋ฆฐ์์๋ object๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ํ์์ ์ธ ์ฝ๋(boilerplate)๋ฅผ ์์ฑํ์ง ์์๋ ๋ฐ๋ก ์ฑ๊ธํด์ ๊ตฌํํ ์ ์๋ค. ์ฑ๊ธํค์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ธ์๋, object๋ ์ต๋ช ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ ์ฌ์ฉ๋๋ค.
object๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์ฑ๊ธํด ํด๋์ค๋ก ๋ง๋ค ๋
- ์ต๋ช ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋
ํน์ง
- ์ฑ๊ธํค ์ธ์คํด์ค ์์ฑ
object๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค๋ฅผ ์ ์ํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ํด๋์ค์ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ์ด ์ธ์คํด์ค๋ ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ๊ณต์ ๋๋ฉฐ, ์ด๋์๋ ๋์ผํ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๋ค. - ํด๋์ค ์ ์์ ์ธ์คํด์ค ์์ฑ์ ๋์์
object๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค๋ฅผ ์ ์ํ๋ฉด์ ๋์์ ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ธ์คํด์ค ์์ฑ์ ํ์ํ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ ํผํ ์ ์๋ค. - ์ ์ ๋ฉ์๋์ ํ๋กํผํฐ๋ฅผ ํฌํจํ ์ ์์
object๋ ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ์๋, ํ๋กํผํฐ, ์ด๊ธฐํ ๋ธ๋ก์ ํฌํจํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฑ๊ธํค ์ธ์คํด์ค์ ๋ํ ๋์์ ์ ์ํ ์ ์๋ค. - ์ต๋ช
ํด๋์ค๋ก ์ฌ์ฉ ๊ฐ๋ฅ
object๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋ช ํด๋์ค๋ฅผ ์ ์ํ ์ ์๋ค. ์ด๋ ํด๋์ค์ ์ ์์ ๋์์ ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉด์, ์ด๋ฅผ ๋ณ์์ ํ ๋นํ์ฌ ์ต๋ช ํด๋์ค์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
๐ค companion object?
class MyClass {
companion object {
fun companionMethod() {
println("Companion method")
}
}
object Singleton {
fun singletonMethod() {
println("Singleton method")
}
}
}
fun main() {
MyClass.companionMethod() // companion method ํธ์ถ, ํด๋์ค ์ธ์คํด์ค ์์ฑ ์์ด ํธ์ถ
MyClass.Singleton.singletonMethod() // singleton method ํธ์ถ
}
// companion object์๋ ํด๋์ค์ ๊ด๋ จ๋ ์ ์ ๋ฉค๋ฒ์ธ companionMethod()๊ฐ ์ ์๋์ด ์๊ณ ,
// object์๋ ํด๋์ค์ ์ฑ๊ธํค ์ธ์คํด์ค์ธ Singleton์ด ์ ์๋์ด ์์
์์์ ๋งํ๋ฏ, ์ฑ๊ธํค์ ๊ตฌํํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ Kotlin์์ object ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. object๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค๋ฅผ ์ ์ํ๋ฉด์ ๋์์ ํด๋น ํด๋์ค์ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. ์ด๋ ๋งค์ฐ ๊ฐํธํ๋ฉฐ, Kotlin์์ ๊ถ์ฅ๋๋ ๋ฐฉ์์ด๋ค.
ํ์ง๋ง, ๋์ ๋ฐ๋ผ์ companion object๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๊ธํค์ ๊ตฌํํ๊ธฐ๋ ํ๋ค. companion object๋ ํด๋์ค ๋ด๋ถ์ ์ ์ธ๋๋ฉฐ, ํด๋น ํด๋์ค์ ์ธ์คํด์ค์ ๊ด๋ จ๋ ์์
์ ์ํํ๋๋ฐ ์ฌ์ฉ๋๋ค. ๋ฐ๋ผ์ companion object๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๊ธํค์ ๊ตฌํํ๋ฉด ํด๋์ค ๋ด๋ถ์์ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
์ด๋ ๋ฐฉ๋ฒ์ ์ ํํ ์ง๋ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ค. ๋ณดํต์ object๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๊ธํค์ ๊ตฌํํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ด๋ค. ํ์ง๋ง ํด๋์ค ๋ด๋ถ์์ ์ถ๊ฐ์ ์ธ ๋ก์ง์ด ํ์ํ๊ฑฐ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ ๋๋ companion object๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๊ธํค์ ๊ตฌํํ๋ ๊ฒ์ด ๋ ์ ํฉํ ์ ์๋ค.
์ฐจ์ด์ ์ ๋ฆฌ
object:
- object๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ ์ํ๋ฉด์ ๋์์ ํด๋น ํด๋์ค์ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
- ํด๋์ค์ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ํด๋น ์ฑ๊ธํค ์ธ์คํด์ค์ ์ ๊ทผํ๋ค.
- object ๋ด๋ถ์๋ ๋ฉ์๋, ํ๋กํผํฐ, ์ด๊ธฐํ ๋ธ๋ก ๋ฑ์ ํฌํจํ ์ ์๋ค.
- ํด๋์ค ๋ด๋ถ๊ฐ ์๋ ์ ์ญ์ ์ธ ๊ณต๊ฐ์์ ์ฌ์ฉ๋๋ค.
companion object:
- ํด๋์ค ๋ด๋ถ์ ์ ์ธ๋๋ ํน๋ณํ ๊ฐ์ฒด๋ก, ํด๋น ํด๋์ค์ ์ธ์คํด์ค์ ๊ด๋ จ๋ ์ ์ ๋ฉค๋ฒ๋ค์ ์ ์ํ ๋ ์ฌ์ฉ๋๋ค.
- ํด๋์ค์ ์ด๋ฆ์ ํตํด ์ ๊ทผํ ์ ์๋ค.
- companion object ๋ด๋ถ์๋ ๋ฉ์๋, ํ๋กํผํฐ, ์ด๊ธฐํ ๋ธ๋ก ๋ฑ์ ํฌํจํ ์ ์๋ค.
- ํด๋์ค ๋ด๋ถ์์๋ง ์ฌ์ฉ๋๋ฉฐ, ํด๋์ค์ ์ธ์คํด์ค์ ๊ด๋ จ๋ ๋์์ ๊ตฌํํ ๋ ์ฃผ๋ก ํ์ฉ๋๋ค.
์ ๋ฆฌํ์๋ฉด object๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง๋ง, companion object๋ ํด๋์ค ๋ด๋ถ์์ ํด๋น ํด๋์ค์ ์ธ์คํด์ค์ ๊ด๋ จ๋ ์ ์ ๋ฉค๋ฒ๋ฅผ ๊ด๋ฆฌํ๋ค. object๋ ์ ์ญ์ ์ธ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , companion object๋ ํด๋์ค ๋ด๋ถ์ ์ ์ ๋ฉค๋ฒ๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ค.