JAVA_Singleton Pattern
๐ JAVA
๐ Singleton Pattern
Singleton Pattern ์ด๋ ๋ฌด์์ผ๊น?
์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋ ๋ ์ด๋ค ํด๋์ค๊ฐ ์ต์ด ํ๋ฒ๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ (static) ๊ทธ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๋์์ธํจํด.
์์ฑ์๊ฐ ์ฌ๋ฌ ์ฐจ๋ก ํธ์ถ๋๋๋ผ๋ ์ค์ ๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ ํ๋๊ณ ์ต์ด ์์ฑ ์ดํ์ ํธ์ถ๋ ์์ฑ์๋ ์ต์ด์ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ( ์๋ฐ์์๋ ์์ฑ์๋ฅผ private๋ก ์ ์ธํ์ฌ ์์ฑ ๋ถ๊ฐํ๊ฒ ํ๊ณ getInstance()๋ก ๋ฐ์์ฐ๊ธฐ๋ ํ๋ค. )
์ฑ๊ธํค ํจํด์ ๋จ ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํด ์ฌ์ฉํ๋ ๋์์ธ ํจํด์ด๋ค.
-> ์ธ์คํด์ค๊ฐ ํ์ ํ ๋ ๋๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ด๋ ๊ฒ์ด ์๋๋ผ, ๋์ผ(๊ธฐ์กด) ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ฒ ํจ.
- ์ธ๋ถ์์ ์์ฑ์์ ์ ๊ทผ ๊ธ์ง -> ์์ฑ์์ ์ ๊ทผ ์ ํ์๋ฅผ private๋ก ์ค์
- ๋ด๋ถ์์๋ private์ ์ ๊ทผ ๊ฐ๋ฅํ๋ฏ๋ก ์ง์ ๊ฐ์ฒด ์์ฑ -> ๋ฉค๋ฒ ๋ณ์์ด๋ฏ๋ก private ์ค์
- ์ธ๋ถ์์ private member์ ์ ๊ทผ ๊ฐ๋ฅํ getter ์์ฑ -> setter๋ ๋ถํ์
- ๊ฐ์ฒด ์์ด ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก getter์ ๋ณ์์ static ์ถ๊ฐ
- ์ธ๋ถ์์๋ ์ธ์ ๋ getter๋ฅผ ํตํด์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ํ๋์ ๊ฐ์ฒด ์ฌ์ฌ์ฉ
Singleton Pattern ์ ์ฌ์ฉํ๋ ์ด์
- ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ป์ผ๋ฉด์ ํ๋ฒ์ new๋ก ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์์
- ์ฑ๊ธํค์ผ๋ก ๋ง๋ค์ด์ง ํด๋์ค์ ์ธ์คํด์ค๋ ์ ์ญ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค๋ค์ด ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ์ฝ๋ค.
- DBCP ( DataBase Connection Pool ) ์ฒ๋ผ ๊ณตํต๋ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํด์ ์ฌ์ฉํด์ผํ๋ ์ํฉ์์ ๋ง์ด ์ฌ์ฉํ๋ค.
- ์ธ์คํด์ค๊ฐ ์ ๋์ ์ผ๋ก ํ๊ฐ๋ง ์กด์ฌํ๋ ๊ฒ์ ๋ณด์ฆํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ
- ๋ ๋ฒ์งธ ์ด์ฉ์๋ถํฐ๋ ๊ฐ์ฒด ๋ก๋ฉ ์๊ฐ์ด ํ์ ํ๊ฒ ์ค์ด๋ค์ด ์ฑ๋ฅ์ด ์ข์์ง๋ ์ฅ์ ์ด ์๋ค.
Singleton Pattern ์ ๋ฌธ์ ์
- ์ฑ๊ธํค ์ธ์คํด์ค๊ฐ ๋๋ฌด ๋ง์ ์ผ์ ํ๊ฑฐ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ์ํฌ ๊ฒฝ์ฐ ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค๋ค ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋์์ ธ โ ๊ฐ๋ฐฉ - ํ์ ์์น โ ์ ์๋ฐํ๊ฒ ๋๋ค => ๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น์ ์ด๊ธ๋๋ค.
- ์์ ์ด ์ด๋ ค์์ง๊ณ ํ ์คํธ๊ฐ ์ด๋ ค์์ง๋ค.
- ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋๊ธฐํ ์ฒ๋ฆฌ๋ฅผ ์ํ๋ฉด ์ธ์คํด์ค๊ฐ ๋๊ฐ๊ฐ ์์ฑ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.
Singleton Pattern ์ค์ตํด๋ณด์ฆ์!
class SingletonClass{
// ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ป์ผ๋ฉด์ ํ๋ฒ์ new๋ก ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ
private static SingletonClass instance = new SingletonClass();
// default ์์ฑ์
private SingletonClass(){}
// ๊ฐ์ฒด ์์ด ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ๋ง๋ค์ด์ค๋ค ( getter ์์ฑ )
public static SingletonClass getInstance(){
return instance;
}
public void sayHello(){
System.out.println("HELLO");
}
}
public class SingletonTest {
public static void main(String[] args) {
// new๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ ํ์๊ฐ ์๋ค
SingletonClass sc1 = SingletonClass.getInstance();
SingletonClass sc2 = SingletonClass.getInstance();
// ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๋ค
System.out.printf("๋ ๊ฐ์ฒด๋ ๊ฐ๋ ? %b%n", sc1 == sc2);
sc1.sayHello();
}
}
์คํ๊ฒฐ๊ณผ
๋ ๊ฐ์ฒด๋ ๊ฐ๋ ? true
HELLO
Singleton Pattern ๋ง๋ฌด๋ฆฌ
๊ฐ์ฒด์ ์์ฑ์ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ด์ฉํ ์ ์๋ Singleton Pattern์ ๋ํด ๊ณต๋ถํด ๋ณด์๋ค.
์ ๋๋ก ๊ณต๋ถํ๊ธฐ ์ ๊น์ง ๋ง๋ฅ ์ด๋ ต๊ฒ๋ง ๋ณด์๋๋ฐ ํ ๋จ๊ณ์ฉ ๋ด๊ฐ๋ฉฐ ๊ณต๋ถํ๋ ๊ฐ๋จํ๋ค.
๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ป์ด ์ธ์คํด์ค๋ฅผ ์์ฑํด ๋๊ณ private๋ก ์ ํํด๋๋ฉด์ ๋ค๋ฅธ ์ธ์คํด์ค ์์ด ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๊ฒ getter๋ฅผ ๋ง๋ค์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ธ์คํด์ค๋ฅผ ํ์ํด์ ์ฌ์ฉํ ๋ ์๋ก์ด ๊ฒ์ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ค.
Singleton ํจํด์ ์ฌ์ฉํจ์ผ๋ก์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ๋ฐฉ์ง์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ์ฌ์ด ์ฅ์ , ๋๋ฒ์งธ ์ด์ฉ๋ถํฐ ์ฑ๋ฅ์ด ์ข์์ง๋ ์ฅ์ ๋ฑ ์ฌ๋ฌ ์ฅ์ ๋ค์ด ์๋ค.
์ฌ๋ฌ ๋์์ธ ํจํด๋ค์ด ์กด์ฌํ๋๋ฐ ์ ๋ฐฐ์๋์ผ๋ฉด ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ฒ ๊ฐ๋ค.
๐ ์ฐธ์กฐ
https://jeong-pro.tistory.com/86