์ฑ๊ธํค ์ฑ๊ธ๋ชฐํธ ์ค์นด์น ์์คํค๊ฐ ์ข๋ค๋ ๋ง์ ๋ค์ด๋ณด์ จ๋์? ์, ์ ์ ๊ฑด๊ฐ์ ์ข์ง ์์ต๋๋ค. ๊ทธ๋์ ์ค๋์ ๋์ Java์ ์ฑ๊ธํค ๋์์ธ ํจํด์ ๋ํด ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด์ ์ ๊ฐ์ฒด ์์ฑ์ ๊ฒํ ํ์ผ๋ฏ๋ก Java์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
Robot robot = new Robot();
ํ์ง๋ง ํด๋์ค์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ์์ฑ๋๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
new Robot() ๋ฌธ์ ๋ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ๋ง์ ์ ์๋ ๊ฒ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฑ๊ธํค ํจํด์ด ๊ตฌ์ถ๋๋ ๊ณณ์ ๋๋ค.
ํ๋ฆฐํฐ์ ์ฐ๊ฒฐํ ์ ํ๋ฆฌ์ผ์ด์ (๋จ์ง ํ๋ฆฐํฐ ํ๋๋ง)์ ์์ฑํ๊ณ ์ธ์ํ๋ผ๊ณ ์ง์ํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
public class Printer {
public Printer() {
}
public void print() {
โฆ
}
}
์ด๊ฒ์ ํ๋ฒํ ์์ ์ฒ๋ผ ๋ณด์ด์ง๋ง... ํ์ง๋ง! ํ๋์ "ํ์ง๋ง"์ด ์์ต๋๋ค. ํ๋ฆฐํฐ ๊ฐ์ฒด์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ๋ค๋ฅธ ์์น์์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ํ๋ฆฐํฐ๊ฐ ์์๋๊ฑฐ๋ ํ์๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํ๋ฆฐํฐ์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ์๋์ง ํ์ธํด์ผ ํ๋ฉฐ ์ด๊ฒ์ด ์ฑ๊ธํค์ด ์ฐ๋ฆฌ๋ฅผ ์ํด ํ ์ผ์ ๋๋ค!
์ฑ๊ธํค์ ๋ง๋๋ ๋ฐฉ๋ฒ
์ฑ๊ธํค์ ๋ง๋๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ๊ฐ์ธ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๋จ์ผ ์ธ์คํด์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๊ณต์ฉ ์ ์ ๋ฉ์๋๋ฅผ ๋ด๋ณด๋ ๋๋ค.
๋จผ์ ๊ฐ์ธ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ํด๋์ค์์ ํ๋๋ฅผ final ๋ก ์ ์ธํ๊ณ ์ด๊ธฐํํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ final ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ด ๋ถ๋ณ ์ด๋ผ๋ ๊ฒ์ ์๋๋ค . ์ฆ, ๋ ์ด์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ํ ์์ฑ์๋ฅผ ์ ์ฉ ์ผ๋ก ์ ์ธํ์ฌ ํด๋์ค ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์๋๋ก ํด์ผ ํฉ๋๋ค . ์ด๋ ํ๋ก๊ทธ๋จ์ ํ๋ฆฐํฐ์ ๋ค๋ฅธ ์ธ์คํด์ค๊ฐ ์์์ ๋ณด์ฅํฉ๋๋ค. ์์ฑ์๋ ์ด๊ธฐํ ์ค์ ํ ๋ฒ๋ง ํธ์ถ๋๋ฉฐ Printer ๋ฅผ ์์ฑํฉ๋๋ค .
public class Printer {
public static final Printer PRINTER = new Printer();
private Printer() {
}
public void print() {
// Printing...
}
}
์ฐ๋ฆฌ๋ ๊ฐ์ธ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ PRINTER ์ฑ๊ธํค์ ์์ฑํ์ต๋๋ค. ์ธ์คํด์ค๋ ํ๋๋ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋งํผ์ธ์๊ธฐ๋ณ์๋ ์ด๋ค ๊ฐ์ฒด์๋ ์ํ์ง ์๊ณ Printer ํด๋์ค ์์ฒด์ ์ํ๊ธฐ ๋๋ฌธ์ ์ ์ ์์ ์๋ฅผ ๊ฐ์ง๋๋ค .
์ด์ ํด๋์ค์ ๋จ์ผ ์ธ์คํด์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๊ธํค์ ์์ฑํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ์ด์ ํ๋๋ private ์ ๋๋ค ).
public class Printer {
private static final Printer PRINTER = new Printer();
private Printer() {
}
public static Printer getInstance() {
return PRINTER;
}
public void print() {
// Printing...
}
}
์ฌ๊ธฐ์์ getInstance() ๋ฉ์๋๋ฅผ ๋ช ๋ฒ ํธ์ถํ๋๋ผ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค.์ธ์๊ธฐ๋ฌผ์ฒด.
๊ฐ์ธ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๊ธํค์ ๋ง๋๋ ๊ฒ์ด ๋ ๊ฐ๋จํ๊ณ ๊ฐ๊ฒฐํฉ๋๋ค. ๋ํ public ํ๋๊ฐ final ๋ก ์ ์ธ๋์ด ํญ์ ๋์ผํ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ํฌํจํ๋๋ก ๋ณด์ฅํ๋ฏ๋ก API๊ฐ ๋ถ๋ช ํฉ๋๋ค.
์ ์ ๋ฉ์๋ ์ต์ ์ API๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ฑ๊ธํค์ ๋น์ฑ๊ธํค ํด๋์ค๋ก ๋ณ๊ฒฝํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. getInstance () ๋ฉ์๋๋ ๊ฐ์ฒด์ ๋จ์ผ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ์ง๋ง ์ด๋ฅผ ํธ์ถํ๋ ๊ฐ ์ฌ์ฉ์์ ๋ํด ๋ณ๋์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
static ์ต์ ์ ์ฌ์ฉํ๋ฉด ์ผ๋ฐ์ ์ธ ์ฑ๊ธํค ํฉํ ๋ฆฌ๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.
์ ์ ์ต์ ์ ๋ง์ง๋ง ์ด์ ์ ๋ฉ์๋ ์ฐธ์กฐ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์์ ์ฅ์ ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๊ณต๊ฐ ํ๋์ ๊ด๋ จ๋ ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ง๋ ฌํ๊ฐ ํ์ํ ๊ฒฝ์ฐ Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๋ํ readResolve ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค . ๊ทธ๋ ์ง ์์ผ๋ฉด ์ญ์ง๋ ฌํ ์ค์ ์ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
๊ฐ์ฒด์ ์ํ๋ฅผ ์ผ๋ จ์ ๋ฐ์ดํธ๋ก ์ ์ฅํ๋ ค๋ฉด ์ง๋ ฌํ๊ฐ ํ์ํ๊ณ ํด๋น ๋ฐ์ดํธ์์ ๊ฐ์ฒด๋ฅผ ๋ณต์ํ๋ ค๋ฉด ์ญ์ง๋ ฌํ๊ฐ ํ์ํฉ๋๋ค. ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ด ๊ธฐ์ฌ๋ฅผ ์ฐธ์กฐํ์ญ์์ค . |
์ด์ ์ฑ๊ธํค์ ๋ค์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
public class Printer implements Serializable {
private static final Printer PRINTER = new Printer();
private Printer() {
}
public static Printer getInstance() {
return PRINTER;
}
}
์ด์ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํํ๊ฒ ์ต๋๋ค.
์๋ ์์ ๋ Java์ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ๋ฅผ ์ํ ํ์ค ๋ฉ์ปค๋์ฆ์ ๋๋ค. "I/O ์คํธ๋ฆผ"(Java Syntax ๋ชจ๋์์) ๋ฐ "Serialization"(Java Core ๋ชจ๋์์)์ ๊ณต๋ถํ ํ์ ์ฝ๋์์ ์ผ์ด๋๋ ์ผ์ ์์ ํ ์ดํดํ ์ ์์ต๋๋ค. |
var printer = Printer.getInstance();
var fileOutputStream = new FileOutputStream("printer.txt");
var objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(printer);
objectOutputStream.close();
var fileInputStream = new FileInputStream("printer.txt");
var objectInputStream = new ObjectInputStream(fileInputStream);
var deserializedPrinter =(Printer) objectInputStream.readObject();
objectInputStream.close();
System.out.println("Singleton 1 is: " + printer);
System.out.println("Singleton 2 is: " + deserializedPrinter);
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฑ๊ธํค 2: Printer@3c756e4d
์ฌ๊ธฐ์์ ์ญ์ง๋ ฌํ๊ฐ ์ฐ๋ฆฌ์๊ฒ ์ฑ๊ธํค์ ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ์์ ์ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํด๋์ค์ readResolve ๋ฉ์๋๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค .
public class Printer implements Serializable {
private static final Printer PRINTER = new Printer();
private Printer() {
}
public static Printer getInstance() {
return PRINTER;
}
public Object readResolve() {
return PRINTER;
}
}
์ด์ ์ฑ๊ธํค์ ๋ค์ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํํฉ๋๋ค.
var printer = Printer.getInstance();
var fileOutputStream = new FileOutputStream("printer.txt");
var objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(printer);
objectOutputStream.close();
var fileInputStream = new FileInputStream("printer.txt");
var objectInputStream = new ObjectInputStream(fileInputStream);
var deserializedPrinter=(Printer) objectInputStream.readObject();
objectInputStream.close();
System.out.println("Singleton 1 is: " + printer);
System.out.println("Singleton 2 is: " + deserializedPrinter);
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ค์์ ์ป์ต๋๋ค.
์ฑ๊ธํค 2: com.company.Printer@6be46e8f
readResolve () ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ญ์ง๋ ฌํํ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์์ผ๋ฏ๋ก ๋ถ๋ ์ฑ๊ธํค ์์ฑ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์์ฝ
์ค๋ ์ฐ๋ฆฌ๋ ์ฑ๊ธํค์ ๋ํด ๋ฐฐ์ ์ต๋๋ค. ์ฑ๊ธํค์ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉ ์๊ธฐ, ์ฉ๋, ์์ฑ์ ์ํด Java์์ ์ ๊ณตํ๋ ์ต์ . ๋ ์ต์ ์ ํน์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ธ ์์ฑ์ | ์ ์ ๋ฐฉ๋ฒ |
---|---|
|
|