[JAVA ๋์์ธ ํจํด] static์ ์์ฉํ ์ฑ๊ธํค ํจํด(Singleton Pattern) ๊ตฌํ
ํด๋์ค ๋ด์ ๋ณ์์ static ํค์๋๋ฅผ ๋ถ์ด๋ฉด ๊ทธ ํด๋์ค์ ์ธ์คํด์ค๋ค์ด ๊ณต์ ํ๋ ํด๋์ค ๋ณ์๊ฐ ๋ฉ๋๋ค. ๋ค์ ์์ ๋ฅผ ๋ด ์๋ค. ์ฌ์ฉ์ ํด๋์ค User๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๋ง๋ค ์ฒซ ๋ฒ์งธ ์ธ์คํด์ค์๋ 1001์, ๋ ๋ฒ์งธ ์ธ์คํด์ค์๋ 1002, ๋ค์์ 1003, ... ์ด๋ฐ์์ผ๋ก 1000๋ถํฐ ์์ํด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐ์์ผ id๋ฅผ ๋ถ์ฌํด์ฃผ๋ ค๊ณ ํฉ๋๋ค.
/*
์ฌ์ฉ์ ํด๋์ค
*/
public class User {
private static Long serialNumber = 1000L;
private Long userId;
private String userName;
public User(String userName) {
this.userName = userName;
serialNumber++;
this.userId = serialNumber;
}
public static Long getSerialNumber() {
return serialNumber;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
'}';
}
public static void main(String[] args) {
System.out.println(User.getSerialNumber()); // serialNumber: 1000
User user1 = new User("๊นํ์ ");
System.out.println(User.getSerialNumber()); // serialNumber: 1001
User user2 = new User("์์ง์");
System.out.println(User.getSerialNumber()); // serialNumber: 1002
User user3 = new User("๋ฐ์ฃผ์");
System.out.println(User.getSerialNumber()); // serialNumber: 1003
System.out.println(user1);
System.out.println(user2);
System.out.println(user3);
}
}
User ํด๋์ค์ serialNumber ๋ณ์์ static ํค์๋๊ฐ ๋ถ์ด์์ต๋๋ค. ์ฆ serialNumber๋ static ๋ณ์(ํด๋์ค ๋ณ์)๋ก์จ, User ํด๋์ค๋ก ์์ฑํ๋ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณต์ ํ๋ ๊ฐ์ด ๋ฉ๋๋ค. 1000๋ฒ๋ถํฐ ์์ํ ๊ฒ์ด๋ฏ๋ก 1000์ผ๋ก ์ด๊ธฐํ๋ฅผ ํด๋์์ต๋๋ค.
๋ค์์ผ๋ก ์ค์ํ๊ฒ ๋ณผ ๊ฒ์ ์์ฑ์์ ๋๋ค. ์์ฑ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ง๋ค ํธ์ถ๋์ง์.
๊ทธ๋์ ์์ฑ์ ์์ serialNumber๋ฅผ 1 ์ฆ๊ฐํ๋ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ์์ต๋๋ค.
์ด์ User()๊ฐ ํธ์ถ๋ ๋ ๋ง๋ค serialNumber๋ 1000๋ถํฐ 1์ฉ ์ฆ๊ฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ serialNumber๋ ์ธ๋ถ์์ ์์ ํ ์ ์๋๋ก private ์ ๊ทผ์ ์ด์๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ๊ฐ์ ๋ฐ์๊ฐ ์ ์๋๋ก getter๋ฅผ ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
์ด์ main ๋ฉ์๋์์ User ์ธ์คํด์ค๋ฅผ ํ๋์ฉ ๋ง๋ค๋ฉฐ ํ์ธํด๋ด ์๋ค.
๊ตฌ์ํ ๋๋ก, ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๋ง๋ค User ํด๋์ค์ serialNumber๊ฐ 1์ฉ ์ฆ๊ฐํ๊ณ ๊ฐ ์ธ์คํด์ค์ userId ๋ณ์์ ์ฆ๊ฐ๋ serialNumber๊ฐ ํ ๋น๋์์ต๋๋ค.
๐ฅ ์คํ ๊ฒฐ๊ณผ
1000
1001
1002
1003
User{userId=1001, userName='๊นํ์ '}
User{userId=1002, userName='์์ง์'}
User{userId=1003, userName='๋ฐ์ฃผ์'}
1003
Process finished with exit code 0
์ฑ๊ธํค ํจํด(Singleton Pattern)
์ด๋ ๊ฒ static ๋ณ์๋ ๋จ์ํ ๋ชจ๋ ์ธ์คํด์ค๋ค์ด ๊ณต์ ํ๊ธฐ ์ํ ๋ณ์๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์ฌ์ฉ๋์ง๋ง ์ด๋ฌํ static ํค์๋์ ํน์ฑ์ ์ด์ฉํ ๋์์ธํจํด์ด ์ฑ๊ธํค ํจํด(Singleton Pattern) ์ ๋๋ค. ๋์์ธ ํจํด์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ํ๋ก๊ทธ๋จ์ ์ค๊ณํ ๋ ํจ์จ์ ์ด๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํ ์ค๊ณ ๊ธฐ๋ฒ์ ๋๋ค.
์ฑ๊ธํค ํจํด์ ํ๋์ ํ๋ก์ ํธ, ์ดํ๋ฆฌ์ผ์ด์ ์์์ ๋จ ํ ๊ฐ๋ง ์กด์ฌํด์ผ ํ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ํ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ค ํด๋์ค๋ฅผ ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค์ ์ธ ๊ฐ์ง๋ฅผ ์งํค๋ฉด ๋ฉ๋๋ค.
โ private ์์ฑ์
โก static ๋ณ์๋ก ๊ฐ์ฒด ์์ฑ
โข ๊ฐ์ฒด์ getter ๊ตฌํ
ํด๋์ค๋ฅผ ์์ ๊ฐ์ด ์ค๊ณํ๋ฉด ์ธ์คํด์ค์ ์ ์ผ์ฑ์ด ๋ณด์ฅ๋ฉ๋๋ค.
์ด๋ค ํ๋ก์ ํธ์์ ์์ ํด๋์ค Store์ ๊ฐ์ฒด๋ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋จ ํ ๊ฐ๋ง ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
Store ํด๋์ค๋ฅผ ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํํ ์์ ์ ๋๋ค.
public class Store {
private static Store instance = new Store();
private Store() { }
public static Store getInstance() {
return instance;
}
}
public class StoreTest {
public static void main(String[] args) {
Store store1 = Store.getInstance();
Store store2 = Store.getInstance();
//Store store3 = new Store(); // ์ง์ ์์ฑ ๋ถ๊ฐ
System.out.println(store1);
System.out.println(store2);
}
}
Store ํด๋์ค ๋ด์ Store ํ์ ์ static ๋ณ์ instance๋ฅผ ์ ์ธํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ์์ต๋๋ค.
์ฌ๊ธฐ์ ์์ฑํ ๊ฐ์ฒด๋ static ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น๋์ด ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ด ๊ฐ์ฒด๋ง์ ์ ์ผํ๊ฒ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
์๋๋ฉด, ์์ฑ์์ ์ ๊ทผ์ ์ด์๋ฅผ private์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ Store ํด๋์ค ์ธ๋ถ์์๋ ์ ๋๋ก ํธ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก Store ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ static getter๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
StoreTest ํด๋์ค์ main ๋ฉ์๋์์ Store ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
new Store()์ ๊ฐ์ด ์์ฑํ ์ ์๊ณ Store์ getInstance()๋ฅผ ํธ์ถํจ์ผ๋ก์จ Store ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๐ฅ ์คํ ๊ฒฐ๊ณผ
com.yoon._static.Store@2c8d66b2
com.yoon._static.Store@2c8d66b2
Process finished with exit code 0
store1, store2๋ฅผ ์ฐ์ด๋ณด๋ฉด ํด์์ฝ๋ ๊ฐ์ด ๋์ผํจ์ ์ ์ ์์ต๋๋ค.
์ฆ, ๋ ๋ณ์๋ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค.
์๋ฐ API์์ ์ฑ๊ธํค ํจํด์ด ์ ์ฉ๋ ์๋ก๋ Calendar ํด๋์ค๊ฐ ์์ต๋๋ค.
// Calendar calendar = new Calendar(); // ์ง์ ์์ฑ ๋ถ๊ฐ
Calendar calendar = Calendar.getInstance();
Calendar ํด๋์ค๋ ์์์ ๊ตฌํํ Store ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฑ๊ธํค ํจํด์ด ์ ์ฉ๋์ด ์๊ธฐ ๋๋ฌธ์ new ์ฐ์ฐ์๋ก ์์ฑ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ Calendar์ static ์ธ์คํด์ค๋ฅผ ๋ฐํํด์ฃผ๋ getInstance()๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
์ด์ฒ๋ผ ์ฑ๊ธํค ํจํด์ ์ง์ ๊ตฌํํ ๊ฒฝ์ฐ๋, ์ ์ฉ๋์ด ์๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ๋ง์ ๋์์ธ ํจํด ์ค ํ๋์ ๋๋ค.
'Javaยท๏ปฟServletยท๏ปฟJSP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ Object ํด๋์ค ์ ๋ฆฌ - toString(), equals(), hashCode(), clone() (0) | 2020.06.30 |
---|---|
[JAVA ๋์์ธ ํจํด] ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด (59) | 2020.06.26 |
JAVA ์ฌ๊ท ํธ์ถ(Recursive Call) ์์ (2) | 2020.04.07 |
SQL ์์กด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌธ์ ์ ๊ณผ JPA (0) | 2020.03.18 |
try-with-resource ๋ฌธ๋ฒ์ ์ฌ์ฉํ JDBC ํ๋ก๊ทธ๋๋ฐ ์์ ์ฝ๋ (0) | 2020.03.11 |
๋๊ธ