- ๋์์ธ ํจํด์ด๋? ์ํํธ์จ์ด๋ฅผ ์ค๊ณํ ๋ ํน์ ๋งฅ๋ฝ์์ ์์ฃผ ๋ฐ์ํ๋ ๊ณ ์ง์ ์ธ ๋ฌธ์ ๋ค์ด ๋ ๋ฐ์ํ์๋ ์ฌ ์ฌ์ฉํ ์ ์๋ ํ๋ฅญํ ํด๊ฒฐ์ฑ
- ๋์์ธ ํจํด์ ์ข
๋ฅ
- ์์ฑ ํจํด : ๊ฐ์ฒด ์์ฑ์ ๊ด๋ จ๋ ํจํด. ๊ฐ์ฒด๋ฅผ ๊ฐญ์ํํด ๋ณํ์ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค.
- ๊ตฌ์กฐ ํจํด : ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์กฐํฉํด ๋ ํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ํจํด
- ํ์ ํจํด : ๊ฐ์ฒด๋ ํด๋์ค ์ฌ์ด์ ์๊ณ ๋ฆฌ์ฆ์ด๋ ์ฑ ์ ๋ถ๋ฐฐ์ ๊ด๋ จ๋ ํจํด. ์์ ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด๋ก ์ด๋ป๊ฒ ๋ถ๋ฐฐํ ์ง, ๊ทธ๋ ๊ฒ ํ๋ฉด์๋ ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ์ต์ํํ๋ ๊ฒ์ ์ค์ ์ ๋๋ค.
์์ฑ ํจํด ์ค ํ๋์ ์ํ๋,
์ฑ๊ธํด(Singleton)
์ฑ๊ธํด์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ์๋๋ก ํ๋ฉด์ ์ด ์ธ์คํด์ค์ ๋ํ ์ ์ญ ์ ๊ทผ(์ก์ธ์ค) ์ง์ ์ ์ ๊ณตํ๋ ์์ฑ ๋์์ธ ํจํด์ ๋๋ค.
์ธ์คํด์ค๊ฐ ์ฌ๋ฌ๊ฐ ์ผ ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.(์์คํ ๋ฐํ์, ํ๊ฒฝ ์ธํ ์ ๋ณด) ์ธ์คํด์ค๋ฅผ ์ค์ง ํ๊ฐ๋ง ์์ฑ ํ ์ ์๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๊ฐ์ฒด์ ์ ์ผ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
→ ์ค์ ํ์ผ์ ๊ฒฝ์ฐ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ๊ฐ ์์ฑ๋๋ฉด ์ค์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ํ์ด ์๊ธธ ์ ์๋ค. ์ด๋ ์ธ์คํด์ค๊ฐ 1๊ฐ๋ง ์์ฑ๋๋ ํน์ง์ ๊ฐ์ง ์ฑ๊ธํด ํจํด์ ์ด์ฉํ๋ฉด ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋กํด์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ํด๋น ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ๋ ํ๋ค.
์ฅ์
: ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
: ๊ฐ์ฒด์ ์ ์ผ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
: ๋๋ฒ์งธ ์ด์ฉ์ ๊ฐ์ฒด ๋ก๋ฉ ์๊ฐ์ด ์ค์ด ์ฑ๋ฅ์ด ์ข์์ง๋ค.
๋จ์
: ์ฑ๊ธํด์ ํ๋ฒ์ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํจ์ผ๋ก “๋จ์ผ ์ฑ ์ ์์น”์ ์๋ฐฐํ๋ค. ๋ํ ๋๋ฌด ๋ง์ ์ผ์ ํ๊ฑฐ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ์ํฌ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ธ์คํด์ค๋ค ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋์ด์ ธ “๊ฐ๋ฐฉํ์ ์์น”์ ์๋ฐฐ๋ ์ ์๋ค.
: ๋ํ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋๊ธฐํ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผํ๋ ๋ฒ๊ฑฐ๋ฌ์๋ ์๋ค.
→ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ง์ํ๋๊ฒ ์ข๋ค
โ ์ค๋ฌด์์ ์ด๋ป๊ฒ ์ฐ์ด๋๊ฐ
- java.lang์ Runtime ํด๋์ค → ์คํํ๋ ํ๊ฒฝ์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅ๊ฐ๋ฅ
โ ๊ตฌํ ๋ฐฉ๋ฒ
public class Setting {
private static Setting instance;
// private ์์ฑ์๋ฅผ ๋ง๋ค๋ฉด ๋ฐ์์๋ ํธ์ถ์ด ์๋๊ณ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
private Setting(){ }
// ๋ด๋ถ์์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ ์ญ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ํด์ผํ๋ค. -> static
public static Setting getInstance(){
if (instance == null) {
instance = new Setting();
}
return instance;
}
}
public static void main(String[] args) {
Setting setting1 = Setting.getInstance();
Setting setting2 = Setting.getInstance();
if (setting1 == setting2){
System.out.println("Hello world!");
}
}
๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ๋ง๋๋ ๋ฐฉ๋ฒ
๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ์ง ์์ ์ด์
๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
1. synchronized ํค์๋ ์ฌ์ฉํ๊ธฐ - ํด๋น ๋ฉ์๋๋ฅผ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ์คํํ ์ ์๋ค.
public static synchronized Setting getInstance(){
if (instance == null) {
instance = new Setting();
}
return instance;
}
๋จ์ → getInstance ํ ๋๋ง๋ค synchronized (lock-release)์ฒ๋ฆฌ๋๋ฌธ์ ์ฑ๋ฅ์ ํ๊ฐ ์ฌ ์ ์๋ค.
2. ์ด๋ฅธ ์ด๊ธฐํ(eager initialization) ์ฌ์ฉํ๊ธฐ
public class Setting {
private static final Setting INSTANCE = new Setting();
private Setting(){}
public static synchronized Setting getInstance(){
return INSTANCE;
}
}
๋จ์ → ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋น์ฉ์ด ๊ทธ๋ ๊ฒ ๋น์ธ์ง ์๋ค๋ฉด ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๋๋๋ค. ํ์ง๋ง ๋ง์ ๋ฆฌ์์ค๊ฐ ํ์ํ ์ธ์คํด์ค๋ผ๋ฉด ์ด๋ฏธ ๋ง๋๋๊ฑฐ ์์ฒด๊ฐ ๋จ์ ์ด ๋ ์ ์๋ค.
3. double checked locking
public class Setting {
private static volatile Setting instance;
private Setting(){ }
public static Setting getInstance(){
if (instance == null) {
synchronized (Setting.class){
if(instance == null){
instance = new Setting();
}
}
}
return instance;
}
}
synchronized ์ฌ์ฉ ๊ฒฝ์ฐ๋ฅผ ๋ฎ์ถฐ ๊ทธ์ ๋ฐ๋ฅธ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์๋ค.
๋จ์ → ๋๋ฌด ๋ณต์กํ ๋ฉ์ปค๋์ฆ์ด๋ฉฐ, java 1.5 ๋ฒ์ ๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
4. static inner class → ๊ถ์ฅ ๋ฐฉ๋ฒ โจ
public class Setting {
private Setting(){}
//inner class
private static class SettingsHolder{
private static final Setting INSTANCE = new Setting();
}
public static Setting getInstance(){
return SettingsHolder.INSTANCE;
}
}
ํด๋์ค ์ด๊ธฐํ๋ ์์์ ํน์ฑ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ์์ ํ๊ณ lazy load๋ ๊ฐ๋ฅํ ์ฝ๋
โ ์ด๊ฑฐ๋ฒ (enum)
enum์ ์ด๊ฑฐํ ์์๋ฅผ ํตํด ์ ์๋ ์ธ์คํด์ค ์ด์ธ์ ์ธ์คํด์ค๋ ์๋ค.
enum์ ์ง๋ ฌํ๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌ๋๊ณ , ๋ฆฌํ๋ ์ ์ ์์ ํ๊ธฐ๋๋ฌธ์ ์ด๊ฑฐํ์ ์ฌ์ฉํ๋ฉด ํด๋น ๋ฌธ์ ๋ค์ ๋ง์ ์ ์๊ณ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ํ๋๋ง ์กด์ฌํ๋ค๋ ๊ฒ์ด ๋ณด์ฅ ๋๋ฏ๋ก, ์ฑ๊ธํค์ ๋ง๋ค๊ธฐ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
reference.
https://refactoring.guru/ko/design-patterns/singleton
https://www.youtube.com/playlist?list=PLfI752FpVCS_v_sc8Q6V9QQN7GhoyktKD
'๋์์ธ ํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋์์ธ ํจํด] ํผ์ฌ๋ ํจํด (0) | 2023.02.18 |
---|
๋๊ธ