Day 17(21.09.29) - Gomserker/Java-101 GitHub Wiki
24. ์ฑ๊ธํค ๋์์ธ ํจํด(Singleton Design Pattern)
(1) ๋์์ธ ํจํด์ด๋?
๋์์ธ ํจํด์ด๋, ์ํํธ์จ์ด๋ฅผ ์ค๊ณํ ๋ ํน์ ๋งฅ๋ฝ์์ ์์ฃผ ๋ฐ์ํ๋ ๊ณ ์ง์ ์ธ ๋ฌธ์ ๋ค์ด ๋ ๋ฐ์ํ์ ๋ ์ฌ์ฌ์ฉํ ์ ์๋ ํด๊ฒฐ์ฑ
์ด๋ค.
์ฌ๊ธฐ์ ํจํด์, ๊ฐ๊ธฐ ๋ค๋ฅธ ์ํํธ์จ์ด ๋ชจ๋์ด๋ ๋ค์ํ ์์ฉ ์ํํธ์จ์ด ์์คํ
์ ๊ฐ๋ฐํ ๋, ์๋ก ๊ณตํต๋๋ ์ค๊ณ ๋ฌธ์ ๊ฐ ์กด์ฌํ๋ฉฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์์ ๊ณตํต์ . ์ด๋ฌํ ๊ณตํต์ ๋ค์ ํจํด์ด๋ผ๊ณ ํ๋ค.
(2) ์ฑ๊ธํค ๋์์ธ ํจํด(Singleton Design Pattern)
์ฑ๊ธํค ๋์์ธ ํจํด์ด๋ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์ธ์คํด์ค๋ฅผ ํ๋๋ง ์์ฑํ๋๋ก ํ๋ฉฐ, ์ด๋์์๋ ์ง ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ํ๋ ํจํด์ด๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๋ถ๋ถ์ ์ธ์คํด์ค๋ฅผ ํ๋๋ง ์์ฑํ๋ค๋ ์ ์ธ๋ฐ, ์ฌ์์ด ๊ทผ๋ฌดํ๋ ํ์ฌ, ์ฐจ๋์ด ์ถ๊ณ ๋๋ ๊ณต์ฅ ๋ฑ ๊ฐ๋์ฉ ๋จ ํ๋์ ์ธ์คํด์ค๋ง์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ด๋ ์ฑ๊ธํค ๋์์ธ ํจํด์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ ์์ฑ๋๋ ์ ์ผํ ์ธ์คํด์ค๋ฅผ ์ฑ๊ธํค(singleton)์ด๋ผ๊ณ ํ๋ค.
(3) ์ฑ๊ธํค ํจํด์ ์ฌ์ฉ๋ฒ
- ์ฑ๊ธํค ์์ฑํ๊ธฐ
์ฑ๊ธํค์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ํด๋์ค ์ธ๋ถ์์ new ์ฐ์ฐ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋๋ก ๋ง์์ผํ๋ค. ๋ง์ฝ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ๋๋ฉด ์ฌ์ฉํ๋งํผ ์ธ์คํด์ค๊ฐ ๊ณ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ฌธ์ ์ด๋ฅผ ๋ง๊ธฐ์ํด ์์ฑ์์ ์ ๊ทผ์ ์ด์ 'private'์ ๋ถ์ฌ์ค๋ค. private ์์ฑ์๋ฅผ ์ฌ์ฉํ์ผ๋ฏ๋ก ๋น์ฐํ ๊ฐ์ ํด๋์ค ๋ด๋ถ์์๋ new ์ฐ์ฐ์๋ก ์์ฑ์๋ฅผ ํธ์ถํ ์ ์๋ค. - ์ ์ ํ๋ ์ ์ธ ๋ฐ ์ธ์คํด์ค ์์ฑ
์์ ์ ํ์ ์ธ ์ ์ ํ๋(static)๋ฅผ ์ ์ธํ๊ณ ์์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ ์ด๊ธฐํํ๋ค. ์์์ ์ธ๊ธํ๋ฏ ํด๋์ค ๋ด๋ถ์์๋ new ์ฐ์ฐ์๋ก ์์ฑ์๋ฅผ ํธ์ถํ ์ ์๋ค. static ํ๋ ๋ํ private ์ ๊ทผ์ ํ์๋ฅผ ๋ถ์ฌ ์ธ๋ถ์์ ํ๋๊ฐ์ ๋ณ๊ฒฝํ์ง ๋ชปํ๋๋ก ํ๋ค. - ์ ์ ๋ฉ์๋(static method) ์ ์ธ
์ธ๋ถ์์ ์์ ์ ํธ์ถํ๋ ์ ์ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ค. ๋ณดํต getInstance()๋ก ์์ฑํ๋๋ฐ, ์ ์ ํ๋์์ ์ฐธ์กฐํ๊ณ ์๋ ์์ ์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํด์ค๋ค.
์๋๋ ์ฑ๊ธํค ํจํด์ ๊ตฌํํ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
public class Singleton {
//์ ์ ํ๋
private static Singleton singleton = new Singleton();
//์์ฑ์
private Singleton() {}
//์ ์ ๋ฉ์๋
static Singleton getInstance() {
return singleton;
}
}
public class SingletonExample {
public static void main(String[] args) {
Singleton object1 = Singleton.getInstance();
Singleton object2 = Singleton.getInstance();
if (object1 == object2) {
System.out.println("๊ฐ์ Singleton ๊ฐ์ฒด์
๋๋ค.");
} else {
System.out.println("๋ค๋ฅธ Singleton ๊ฐ์ฒด์
๋๋ค.");
}
}
}
Result
๊ฐ์ Singleton ๊ฐ์ฒด์
๋๋ค.
์ ํ๋ก๊ทธ๋จ์ ํ๋์ฉ ์ดํด๋ณด์
private static Singleton singleton = new Singleton();
๋จผ์ ์ ์ ํ๋๋ฅผ ์ ์ธํ๊ณ ์ธ์คํด์ค๋ฅผ ์์ฑํด ์ด๊ธฐํํ๋ค. ์ฌ๊ธฐ์ singleton์ด๋ผ๋ ์ฐธ์กฐ๋ณ์๊ฐ ์์ฑ๋ ์ธ์คํด์ค์ธ Singleton์ ์ฐธ์กฐํ๊ณ ์๋ค.
private Singleton() {}
์ธ๋ถ์์ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ๋ชปํ๋๋ก private ์ ๊ทผ์ ํ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ์๋ฅผ ์ ์ธํ๋ค.
static Singleton getInstance() {
return singleton;
}
๊ทธ๋ฆฌ๊ณ , ์ ์ ํ๋์์ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ์ ์ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ค.
์ด๋ ๊ฒ ์์ฑ๋ ํด๋์ค๋ private ์ ๊ทผ์ ํ์๋ฅผ ์ฌ์ฉํ๊ธฐ์ ์ธ๋ถ์์
1)
Singleton object1 = new Singleton();
Singleton object2 = new Singleton();
2)
Singleton object1 = Singleton.getInstance();
Singleton object2 = Singleton.getInstance();
1๋ฒ๊ณผ ๊ฐ์ด new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. ๋์ 2๋ฒ ๋ฐฉ๋ฒ์ฒ๋ผ ์ ์ผํ๊ฒ ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ํธ์ถํ๋ ์ ์ ๋ฉ์๋์ธ getInstance()๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์๋ค. ์ฌ๊ธฐ์ object1๊ณผ object2์ ์ฃผ์๊ฐ์ ์ถ๋ ฅํด๋ณด๋ฉด ๊ฐ์ ์ฃผ์๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํตํด, ์ธ์คํด์ค๋ ๋จ ํ๋๋ฟ์ด๋ผ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ค์๊ณผ ๋ค์ ํ๋ก๊ทธ๋จ์ ์์ด์ธ๋งจ์ ์ ์ผํ ์ธ์คํด์ค, ์ฑ๊ธํค์ผ๋ก ์ค์ ํ๋ค. ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
Result
Tony Stark, 32
Tony Stark, 32
IronMan@880ec60
IronMan@880ec60
์์ ๋ง์ฐฌ๊ฐ์ง๋ก ironman1๊ณผ ironman2 ์ฐธ์กฐ๋ณ์๋ ์ฑ๊ธํค์ธ IM ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.