Singleton
์ฑ๊ธํค ํจํด์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ๋จ ํ๋์ ์ธ์คํด์ค๋ง ์์ฑ๋์ด ๊ณต์ ๋์ด์ผ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ๋ํ์ ์ธ ์๋ก ๋ก๊น (Logger)์ด๋ ์คํ๋ง๋น์ด ์์ต๋๋ค.
Default Singleton (Eager Initialization)
ํด๋์ค๊ฐ ๋ก๋ฉ๋ ๋ ๋ฏธ๋ฆฌ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
์ฅ์ : ๊ตฌํ์ด ๊ฐ๋จํ๋ฉฐ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ์์ ํฉ๋๋ค.
๋จ์ : ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() { }
public static EagerSingleton getInstance() {
return instance;
}
}object EagerSingleton {
fun doSomething() {
println("EagerSingleton ์์
์ํ")
}
}Instance Field ๋ฐฉ์
ํด๋์ค ๋ก๋ฉ ์์ ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฏ๋ก Default ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๋ถํ์ํ ์ ์์ต๋๋ค.
public class InstanceFieldSingleton {
private static InstanceFieldSingleton instance = new InstanceFieldSingleton();
private InstanceFieldSingleton() { }
public static InstanceFieldSingleton getInstance() {
return instance;
}
}class InstanceFieldSingleton private constructor() {
// ์ฑ๊ธํค ์ธ์คํด์ค๋ ํด๋์ค๊ฐ ๋ก๋ฉ๋ ๋ ๋ฐ๋ก ์์ฑ๋จ.
companion object {
private val instance = InstanceFieldSingleton()
// ์ธ๋ถ์์ ์ธ์คํด์ค์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋
fun getInstance(): InstanceFieldSingleton = instance
}
// ์ฑ๊ธํค ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ์ ์ํ๋ ๋ฉ์๋ ์์
fun doSomething() {
println("InstanceFieldSingleton ์์
์ํ")
}
}
Lazy Loading
ํด๋์ค๊ฐ ๋ก๋ฉ๋ ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ , ์ค์ ๋ก ํ์ํ ๋ ์์ฑํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ ๋๋ค.
์ฅ์ : ์ค์ ์ฌ์ฉ ์์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ ๋๋ค.
๋จ์ : ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋๊ธฐํ(synchronized) ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() { }
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}class LazySingleton private constructor() {
companion object {
val instance: LazySingleton by lazy { LazySingleton() }
}
fun doSomething() {
println("LazySingleton ์์
์ํ")
}
}Standard / Joshua ๋ธ๋ก ๋ฐฉ์
Joshua Bloch๊ฐ ์ ์ํ ๋ฐฉ์์ผ๋ก, Bill Pugh์ ๋ด๋ถ ์ ์ ํด๋์ค ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํด๋์ค ๋ก๋ฉ ์์ ๊ณผ ์ค์ ์ฌ์ฉ ์์ ์ ์ฅ์ ์ ๋ชจ๋ ์ทจํ๋ฉฐ, ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํฉ๋๋ค.
public class StandardSingleton {
private StandardSingleton() { }
private static class SingletonHelper {
private static final StandardSingleton INSTANCE = new StandardSingleton();
}
public static StandardSingleton getInstance() {
return SingletonHelper.INSTANCE;
}
}// ์ฝํ๋ฆฐ ์์ : ์ฝํ๋ฆฐ์์๋ object๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
object StandardSingleton {
fun doSomething() {
println("StandardSingleton ์์
์ํ")
}
}Default/Instance Field ๋ฐฉ์: ํด๋์ค ๋ก๋ฉ ์์ ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ๊ฐ๋จํ์ง๋ง, ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋ฉ๋๋ค.
Lazy Loading ๋ฐฉ์: ์ธ์คํด์ค๊ฐ ์ค์ ๋ก ํ์ํ ๋ ์์ฑํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ์ง๋ง, ๋๊ธฐํ ๋น์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
Standard/Joshua ๋ฐฉ์: Bill Pugh์ ๋ด๋ถ ํด๋์ค ๋ฐฉ์์ ํ์ฉํด ์ค๋ ๋ ์์ ํ๋ฉด์๋ ์ง์ฐ ์ด๊ธฐํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
Last updated