[๋์์ธ ํจํด] ์์ฑ ํจํด - ์ฑ๊ธํค ํจํด
by rlaehddnd0422์ฑ๊ธํค ํจํด์ด๋?

- ํ๋์ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ง๋ง, ๊ทธ๋ ๊ฒ ํ์ง ์๊ณ ํ๋์ ์ธ์คํด์ค๋ง ๋ง๋ค์ด ์ฌ์ฉํ๋ ํจํด.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ชจ๋์์ ์ฌ์ฉํ๋ค๊ณ ๋ณด๋ฉด ๋๊ฒ ์.
์ฑ๊ธํค ํจํด ์ฌ์ฉ ์ด์
- ๋ฐ์ดํฐ๋ฒ ์ด์ ์ปค๋ฅ์ ํ๊ณผ ๊ฐ์ด ํ๋์ ์ธ์คํด์ค๋ง ๋ง๋ค์ด ๋๊ณ ์ด ์ธ์คํด์ค๋ฅผ ์ฌํ์ฉํ์ฌ ํ์๋ก ํ๋ ์์ ๋ค์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ์ ๊ฐ์ด, ์ธ์คํด์ค๋ฅผ ๋ถํ์ํ๊ฒ ์ฌ๋ฌ๊ฐ ๋ง๋ค ํ์๊ฐ ์์ ๋ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ์ฌ ๋ถํ์ํ ์์ ์ฌ์ฉ์ ๋ง๊ธฐ ์ํด.
์ฑ๊ธํค ํจํด ์์ฑ ๋ฐฉ๋ฒ
0. ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์
- ์ฑ๊ธํค ํจํด์ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ ๊ฐ ์ด์์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ง์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฐ์ ์ ์ผ๋ก ๊ฐ์ฒด ์์ฑ์ ์ํ new ํค์๋์ ์ ์ฝ์กฐ๊ฑด์ ๊ฑธ์ด์ค์ผ ํ๊ณ , ๋ง๋ค์ด์ง ๋จ์ผ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์๋ ๋ฉ์๋๊ฐ ํ์ํฉ๋๋ค.
public class Main { public static void main(String[] args) { Singleton singleton1 = Singleton.getInstance(); Singleton singleton2 = Singleton.getInstance(); System.out.println(singleton1 == singleton2); // True } static class Singleton { private static final Singleton INSTANCE; // static ์์ญ์ ๋ฏธ๋ฆฌ ํ๋ ๋ง๋ค์ด ๋์ ํ, ๊ฐ์ฒด ์์ฑ์ getIntance()๋ก ํธ์ถํ์ฌ, ํญ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํ๋๋ก ์ค์ public static Singleton getInstance() { if(INTANCE == null) { INSTANCE = new SingleTon(); } return Singleton.INSTANCE; } // ์์ฑ์๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ง์์ฃผ๊ธฐ private Singleton{}( // ๋ด๋ถ์ ์ผ๋ก ํธ์ถํ๋ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋์ ธ ๋ด๋ถ์์๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ๋ชปํ๋๋ก ์ค์ . throw new AssertionError(); ) } }
- ํ์ง๋ง ์ด ๋ฐฉ์์ ๊ฒฝ์ฐ Thread Safe ํ์ง ์๋ค๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์์.
public static Singleton getInstance() { // Thread A์ Thread B์์ ๋์์ getInstance()๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด if ์กฐ๊ฑด๋ถ๊ธฐ๋ฌธ์ด A์ B์์ ๋ชจ๋ ํต๊ณผํ๋ ๊ฒฝ์ฐ SingleTon์ด ๊นจ์ง๊ฒ ๋จ. if(INTANCE == null) { INSTANCE = new SingleTon(); } return Singleton.INSTANCE; }
- ์ ์ฝ๋์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ getInstance()๋ฅผ ๋์์ ํธ์ถํ๋ ๊ฒฝ์ฐ Singleton ์ธ์คํด์ค๊ฐ ๋ ๊ฐ ์์ฑ๋์ด ์ฑ๊ธํค ํจํด์ด ๊นจ์ง ์ฐ๋ ค๊ฐ ์์.
Thread Safeํ ์ฑ๊ธํค ํจํด ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ด ์๋ค.
1. static + ์ค์ฒฉํด๋์ค(ํ๋) ๋ฐฉ์
public class Singleton { private Singleton() { } private static class SingletonHolder { private static final Singleton SINGLETON_OBJECT = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.SINGLETON_OBJECT; } }
- ์ ํ๋ฆฌ์ผ์ด์ ๋น ๋จ ํ๋ + SingletonHoder๋ฅผ ์ค์ ์ฌ์ฉํ ๋๊น์ง ์ด๊ธฐํ๋ฅผ ๋ฏธ๋ฃธ.
- JVM์ ํด๋์ค ๋ก๋์ ์ํด ๋ก๋๋ ๋ ๋ด๋ถ์ ์ผ๋ก ์คํ๋์ด ์์ฑ๋จ.
- ์ ์ ์ด๊ธฐํ๋ก ์์ฑ๋๋ฏ๋ก Thread Safeํ๋ค๋ ์ฅ์ .
- Thread Safe : ์ฌ๋ฌ ์ค๋ ๋์์ getInstance()๋ฅผ ํธ์ถํด๋ ๋จ ํ๋์ ์ธ์คํด์ค๋ง ๋ฆฌํด.
2. Eager init ๋ฐฉ์
public class Singleton { private static final Singleton SINGLETON_OBJECT = new Singleton(); private Singleton() { } public static synchronized Singleton getInstance() { return SINGLETON_OBJECT; } }
- ๋ฏธ๋ฆฌ static ์์ญ์ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ์์ฑํด๋๋ ๋ฐฉ์.
- ๋ง์ฝ ์์ฑ ๋น์ฉ์ด ํฌ๊ณ , ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น์ ์ฐ๋ ค๊ฐ ์์.
- ์ถ๊ฐ๋ก ์์ฑ๊ณผ ๋์์ final ํค์๋๋ฅผ ํตํด ๋ถ๋ณ์ฑ์ ๋ณด์ฅํด์ค ์ ์์.
3. Synchronized lazy init ๋ฐฉ์
static class Singleton { private static Singleton singletonObject; private Singleton() { } public static synchronized Singleton getInstance() { if (singletonObject == null) { singletonObject = new Singleton(); } return singletonObject; } }
- ๋จ์ํ synchronized ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ getInstance() ๋ฉ์๋์ ํ๋์ ์ค๋ ๋๋ง์ด ์ ๊ทผํ ์ ์๋๋ก ํ๊ฒ ํ๋ ๋ฐฉ๋ฒ.
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ๊ฒ ๋๋ฉด ๋๊ธฐํ ์์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ํ ๋ฐ์ํ ์ ์์.
4. double check locking ๋ฐฉ์
- volatile ํค์๋์ ๋๋ธ ์ฒดํฌ๋ฅผ ํตํ synchronized ํค์๋๋ฅผ ํ์ฉํ์ฌ ์ด๊ธฐํ ํ ๋๋ง ๋๊ธฐํ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ.
volatile
keyword๋ Java ๋ณ์๋ฅผ Main Memory์ ์ ์ฅํ๊ฒ ๋ค๋ผ๋ ๊ฒ์ ๋ช ์ํ๋ ํค์๋- ์์ synchronized lazy init ๋ฐฉ์ ์ฒ๋ผ getInstance()๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋๊ธฐํ ์์ ์ ๊ฑธ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, "์ต์ด" ์ด๊ธฐํ ์์๋ง ๋๊ธฐํ ์์ ์ํ.
- JVM ๋ฒ์ ์ด 1.5 ์ด์์ธ ๊ฒฝ์ฐ์๋ง ์ ์ฉ ๊ฐ๋ฅ
public class Singleton { // volatile ํค์๋ ์ฌ์ฉ private static volatile Singleton singletonObject; private Singleton() { } public static Singleton getInstance() { if (singletonObject == null) { // if ๋ฌธ ์ง์
์์๋ง Singleton ํด๋์ค์ ๋ํ ๋๊ธฐํ ์์
์ํ synchronized (Singleton.class) { if (singletonObject == null) { singletonObject = new Singleton(); } } } return singletonObject; } }
5. Enum ๋ฐฉ์
- enum ํ์ ์ผ๋ก ์ฑ๊ธํค์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ.
- ํจ์ฌ ๊ฐ๊ฒฐํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, Serialize ๋๋ Reflection ๊ณต๊ฒฉ์์๋ ์ฑ๊ธํค์ด ๊นจ์ง๋ ๊ฒ์ ์๋ฒฝํ ๋ง์ ์ ์์.
- ๋ง๋๋ ค๋ ์ฑ๊ธํค์ด enum์ธ์ ํด๋์ค๋ฅผ ์์ํด์ผ ํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. (๋ค๋ง, enum Singleton implements ~์ ๊ฐ์ด ์ธํฐํ์ด์ค๋ ๊ตฌํํ๋๋ก ์ ์ธํ ์๋ ์์)
public enum Singleton { INSTANCE; }
<์ฐธ๊ณ ์๋ฃ>
[Java] ์ฑ๊ธํค ํจํด(Singleton Pattern) - ๊ฐ๋ ๋ฐ ์์
์ฑ๊ธํค ํจํด(Singleton Pattern) ์ฑ๊ธํค ํจํด์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ํน์ ํด๋์ค๊ฐ ๋จ ํ๋๋ง์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๊ธฐ ์ํ ํจํด์ด๋ค. ์์ฑ์๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋๋ผ๋ ์ธ์คํด์ค๊ฐ ํ
ittrue.tistory.com
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422