π§ λ€μ΄κ°κΈ° μ ...
μ±κΈν€ ν¨ν΄μ΄λ?
μ±κΈν€: ν΄λμ€κ° λ¨ "νλμ μΈμ€ν΄μ€"λ§ κ°μ§λλ‘ λ³΄μ₯
νλμ μΈμ€ν΄μ€λ§ κ°μ‘μ λμ μ₯μ μ "μΌκ΄μ±"μμ λΉλ‘―λλ€.
μλ₯Ό λ€μ΄, μ°λ¦¬λλΌμ ννκ° λ°νλλ κ³³μ μ€μμνμΈ νκ΅μνμμλ§ λ°νλλ€.
λ§μ½μ ννλ₯Ό νκ΅μνμμλ§μ΄ μλ μ¬λ¬ κ³³μμ μ°μ΄λΈλ€λ©΄ μΌκ΄μ±μ΄ κΉ¨μ§κ² λ κ²μ΄λ€.
ν΅νμ νλ¦μ νμ νκΈ°κ° μ΄λ ΅κ² λκ³ , λΆμ νν ννκ° μ ν΅λ μλ μλ€.
μ¦, νλμ κΈ°κ΄μμ λͺ¨λ κ²μ κ΄λ¦¬ν¨μΌλ‘μ¨ μΌκ΄μ±κ³Ό μ λ’°μ±μ μ±κΈΈ μ μλ€.
μ±κΈν€μ λμμ 무μν(stateless)κ°μ²΄ νΉμ μ€κ³μ μ μΌν΄μΌ νλ μμ€ν μ»΄ν¬λνΈκ° λλ€.
[μ΄ν©ν°λΈ μλ° δΈ]
μ΄μ²λΌ, μ½λλ₯Ό μ§€ λμλ νλμ μΈμ€ν΄μ€λ§ κ°μ§λλ‘ λ³΄μ₯ν΄μΌνλ κ²½μ°κ° μλ°λ₯Έλ€.
μ΄λ μ¬λ¬ μΈμ€ν΄μ€λ₯Ό νμ©νμ§ μμμΌλ‘μ¨ μΆ©λκ³Ό νΌλμ λ°©μ§νκ³ , μμ€ν μ 체μ ν΅μΌμ±μ μ 곡νλ€.
β Singletonμ λ§λλ λ°©λ²
1οΈβ£ public static final
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
public static void main(String[] args){
Elvis elvis = Elvis.INSTANCE;
}
}
첫 λ²μ§Έλ‘ μκ°νλ λ°©μμ μμ κ°μ΄ νλκ°μ publicμΌλ‘ μ§μ νκ³ staticμΌλ‘ Instanceλ₯Ό μμ±ν νμ,
μ§μ μ μΌλ‘ ν΄λΉ μΈμ€ν΄μ€μ μ κ·Όνλ λ°©λ²μ΄λ€.
μ΄λ μμ±μλ privateλ‘ λ§μ νλκ°μμ μ μν μΈμ€ν΄μ€μλ§ μ κ·Όν μ μλλ‘ μ€μ νλ€.
2οΈβ£ μ μ ν©ν 리 λ©μλ
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance(){
return INSTANCE;
}
public static void main(String[] args){
Elvis elvis = Elvis.getInstance();
}
}
λ λ²μ¨°μ λ°©μμ static factory methodλ₯Ό μ΄μ©νλ λ°©μμ΄λ€.
ꡬννλ λ°©μμ λ€μκ³Ό κ°λ€.
- νλ κ°μ private staticμΌλ‘ Instanceλ₯Ό μμ±νλ€.
- privateλ‘ κΈ°λ³Έ μμ±μλ₯Ό λ§μλλ€.
- getInstance() λ©μλλ₯Ό public staticμΌλ‘ λκ³ , νλμ μμ±ν΄λ Instanceλ₯Ό returnνλ€.
π© 리νλ μ (Reflection)μΌλ‘ μ±κΈν€ κΉ¨λ¨λ¦¬κΈ°
κ·Έλ¬λ μμ κ°μ λ°©μμ 리νλ μ (Reflection)μΌλ‘ μΈν μΈμ€ν΄μ€κ° μμ±λ μ μλ€λ λ¨μ μ΄ μλ€.
리νλ μ
: 리νλ μ
μ Javaμ κ°λ ₯ν κΈ°λ₯μΌλ‘, λ°νμ λμμ μ μ°μ±κ³Ό λμ κ°μ²΄ μ‘°μμ κ°λ₯νκ² νλ€.
(Javaμμ 리νλ μ
μ μ£Όλ‘ java.lang.reflect ν¨ν€μ§λ₯Ό ν΅ν΄ μ 곡λλ€.)
리νλ μ μ κΈ°λ₯μ λ€μκ³Ό κ°λ€.
- ν΄λμ€ μ 보 νμ
- μμ±μ νμ λ° νΈμΆ
- νλ μ κ·Ό λ° μμ
- λ©μλ νΈμΆ
- μ λ Έν μ΄μ νμ
λ°λΌμ ν΄λΉ 리νλ μ μ κΈ°λ₯, μμ±μλ₯Ό νμνκ³ νλλ₯Ό μμ νκ² λλ€λ©΄ λ€μκ³Ό κ°μ΄ μ±κΈν€μ κΉ¨λ¨λ¦΄ μ μκ² λλ€.
public static final μ±κΈν€ class κΉ¨λ¨λ¦¬κΈ°
import java.lang.reflect.Constructor;
public class ReflectionTest {
public static void main(String[] args) throws Exception {
// κΈ°μ‘΄ μ±κΈν€ μΈμ€ν΄μ€ κ°μ Έμ€κΈ°
Elvis instance1 = Elvis.INSTANCE;
// 리νλ μ
μΌλ‘ private μμ±μ μ κ·Ό
Constructor<Elvis> constructor = Elvis.class.getDeclaredConstructor();
constructor.setAccessible(true); // private μ κ·Ό κ°λ₯νκ² μ€μ
// μλ‘μ΄ μΈμ€ν΄μ€ μμ±
Elvis instance2 = constructor.newInstance();
// μΈμ€ν΄μ€ λΉκ΅
System.out.println("instance1 == instance2: " + (instance1 == instance2)); // false
}
}
μ μ ν©ν 리 λ©μλ μ±κΈν€ class κΉ¨λ¨λ¦¬κΈ°
// μ±κΈν€ ν΄λμ€
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
// 리νλ μ
μΌλ‘ μ±κΈν€ νκ΄΄
Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor();
constructor.setAccessible(true); // private μμ±μ μ κ·Ό νμ©
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = constructor.newInstance();
System.out.println(instance1 == instance2); // false
π© μ§λ ¬ν(Serialization)λ‘ μ±κΈν€ κΉ¨λ¨λ¦¬κΈ°
import java.io.Serializable;
public class Elvis implements Serializable {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {}
// μμ§λ ¬ν μ νμ κΈ°μ‘΄ μΈμ€ν΄μ€λ₯Ό λ°ν
private Object readResolve() {
return INSTANCE;
}
}
λ§μ½ μμ μ½λμ²λΌ μ§λ ¬νλ‘ μ±κΈν€ ν΄λμ€κ° ꡬνλ κ²½μ°μλ μμ§λ ¬νλ₯Ό ν΅ν΄ μ±κΈν€μ κΊ λ¨λ¦΄ μ μλ€.
import java.io.*;
public class SerializationTest {
public static void main(String[] args) throws Exception {
// κΈ°μ‘΄ μ±κΈν€ μΈμ€ν΄μ€
Elvis instance1 = Elvis.INSTANCE;
// μ§λ ¬ν
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("elvis.obj"));
out.writeObject(instance1);
out.close();
// μμ§λ ¬ν
ObjectInputStream in = new ObjectInputStream(new FileInputStream("elvis.obj"));
Elvis instance2 = (Elvis) in.readObject();
in.close();
// μΈμ€ν΄μ€ λΉκ΅
System.out.println("instance1 == instance2: " + (instance1 == instance2)); // false
}
}
μ§λ ¬νλ κ°μ²΄λ₯Ό μμ§λ ¬ννλ©΄ μλ‘μ΄ μΈμ€ν΄μ€κ° μμ±λλ―λ‘ μ±κΈν€ 보μ₯μ΄ κΉ¨μ§λ€.
β Singleton 보μ₯νκΈ°
1οΈβ£ Reflection λ°©μ΄νκΈ°
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private static boolean instanceCreated = false;
private Elvis() {
if (instanceCreated) {
throw new IllegalStateException("μ΄λ―Έ μΈμ€ν΄μ€κ° μ‘΄μ¬ν©λλ€!");
}
instanceCreated = true;
}
}
μμ±μ λ΄λΆμμ μ€λ³΅ μμ± λ°©μ§ λ‘μ§μ μΆκ°νμ¬ reflectionμΌλ‘ μ±κΈν€μ κΉ¨λ¨λ¦¬λ λ°©μμ λ°©μ΄ν μ μλ€.
2οΈβ£ μ§λ ¬ν λ°©μ΄νκΈ°
import java.io.Serializable;
public class Elvis implements Serializable {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {}
// μμ§λ ¬ν μ νμ κΈ°μ‘΄ μΈμ€ν΄μ€λ₯Ό λ°ν
private Object readResolve() {
return INSTANCE;
}
}
readResolve() λ©μλλ₯Ό νμ©νμ¬ μμ§λ ¬ν μ μλ‘μ΄ κ°μ²΄κ° μλλΌ κΈ°μ‘΄μ λ§λ€μ΄λμ μ±κΈν€ κ°μ²΄λ₯Ό λ°ννλλ‘ μ€μ νμ¬ λ°©μ΄ν μ μλ€.
3οΈβ£ enumμΌλ‘ λ°©μ΄νκΈ°
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() {
System.out.println("Elvisκ° κ±΄λ¬Όμ λ λ¬μ΅λλ€!");
}
}
enumμΌλ‘ μ±κΈν€ ν΄λμ€λ₯Ό ꡬννλ©΄ λ€μκ³Ό κ°μ μ΄μ μ μ§λλ€.
- INSTANCEλ enum μμλ‘ μ μΈλλ©°, Javaλ enum μμλ₯Ό JVM μ°¨μμμ λ¨ ν λ²λ§ μμ±νλλ‘ λ³΄μ₯νλ€.
- κΈ°λ³Έμ μΌλ‘ public static final μμ±μ κ°μ§λ―λ‘ λ³λμ μ±κΈν€ ꡬνμ΄ νμνμ§ μλ€.
- μμ±μκ° μλμΌλ‘ privateμΌλ‘ μ€μ λλ―λ‘ μΈλΆμμ κ°μ²΄ μμ±μ΄ λΆκ°λ₯gkek.
λ°λΌμ enumμ μ¬μ©νμ¬ μ±κΈν€ ν΄λμ€λ₯Ό ꡬννκ² λλ€λ©΄,
리νλ μ κ³Ό μ§λ ¬νλ₯Ό ν΅ν΄ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
βοΈ μ₯μ
Enum μ±κΈν€ ν΄λμ€μ μ₯μ μ μ 리ν΄λ³΄μλ©΄ λ€μκ³Ό κ°λ€.
πJVM 보μ₯
enumμ JVM μμ€μμ λ¨μΌ μΈμ€ν΄μ€ μμ±μ 보μ₯νλ©°, 리νλ μ μ΄λ μ§λ ¬ν 곡격μΌλ‘λΆν° μμ νλ€.
(1) 리νλ μ 곡격 λ°©μ΄
enumμ μμ±μλ 리νλ μ μΌλ‘ μ κ·Όν μ μλλ‘ Java μΈμ΄κ° λ§κ³ μλ€.
(2) μ§λ ¬ν 곡격 λ°©μ΄
enumμ λ³λμ readResolve() λ©μλλ₯Ό ꡬννμ§ μμλ JVMμ΄ μλμΌλ‘ λμΌν μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
π ꡬν κ°κ²°μ±
볡μ‘ν λ°©μ΄ λ‘μ§ μμ΄λ λ¨μν μ½λλ‘ μ±κΈν€μ ꡬνν μ μλ€.
πThread Safe
λ©ν°μ€λ λ νκ²½μμλ λκΈ°ν λ¬Έμ λ₯Ό μ κ²½ μΈ νμκ° μλ€.
βοΈ λ¨μ
λ°λ©΄ enumμ μ±κΈν€ ν΄λμ€μ λν΄ λ€μκ³Ό κ°μ λ¨μ μ κ°μ§κ³ μκΈ°λ νλ€.
πν΄λμ€ νμ₯μ΄ λΆκ°λ₯
enumμ λ€λ₯Έ ν΄λμ€λ₯Ό μμν μ μλ€.
πμ΄κΈ°ν λ Όλ¦¬ μ ν
enumμ κ°λ¨ν μ±κΈν€ ꡬνμ μ ν©νμ§λ§, 볡μ‘ν μ΄κΈ°ν λ‘μ§μ΄ νμν κ²½μ° μ€κ³κ° 볡μ‘ν΄μ§ μ μλ€.
π’ REF
μ΄ν©ν°λΈ μλ° 3/E