-
[Java] λμμΈ ν¨ν΄ (Singleton ν¨ν΄)Android/Java 2021. 1. 5. 22:50λ°μν
- μ΄ κΈμ "μΈνλ° Java λμμΈ ν¨ν΄" κ°μλ₯Ό λ£κ³ 곡λΆν λ΄μ©μ λ°νμΌλ‘ κΈμ μμ±νμμ΅λλ€.
Singleton ν¨ν΄μ΄λ?
μ΄ ν¨ν΄μ μ£Όλ‘ μΈμ€ν΄μ€ μμ±μ νλ² ν ν μ ꡬμμμ κ°μ μΈμ€ν΄μ€λ₯Ό μ¬μ©νκ³ μ ν λ μ¬μ©νλ ν¨ν΄μ λλ€.
μ΄ ν¨ν΄μ μ¬μ©νλ©΄ μ μ μΈμ€ν΄μ€μ΄κΈ° λλ¬Έμ μ¬λ¬ ν΄λμ€μμ λκ°μ λ°μ΄ν°λ₯Ό 곡μ νκΈ° μ½λ€λ μ₯μ μ΄ μμ΅λλ€.
νμ§λ§ μ¬λ¬ ν΄λμ€μμ μ±κΈν€ μΈμ€ν΄μ€κ° νΈμΆλκ³ μ¬μ©λλ€λ©΄ μμ°μ€λ½κ² κ²°ν©λλ μ¦κ°νκ² λ©λλ€.
κ²λ€κ° λ©ν°μ€λ λ νκ²½μμλ λκΈ°ν μμ μ΄ νμμ μΌλ‘ μ§νλμ΄μΌ ν©λλ€. (μ¬λ¬ μΈμ€ν΄μ€ μμ± κ°λ₯μ±μ΄ μλ€.)
λ°μ΄ν°λ² μ΄μ€λ λ μ§μ€νΈλ¦¬ κ°μ λ¨ νλλ‘ μ‘΄μ¬ν΄μΌ μλ―Έκ° μμ λ μ¬μ©νλ©΄ ν¨κ³Όμ μ λλ€.
Singleton μ¬μ©
public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }
Singleton κ°μ²΄λ₯Ό λ€μκ³Ό κ°μ΄ ꡬνν©λλ€.
getInstance λ©μλλ₯Ό staticμΌλ‘ ꡬννμ¬ κ°μ²΄ μμ±μ νμ§ μμλ νΈμΆν μ μλλ‘ ν©λλ€.public class Main { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); Singleton singleton1 = Singleton.getInstance(); if(singleton == singleton1){ System.out.println("κ°μ"); }else{ System.out.println("λ€λ¦"); } } }
new λ‘ κ°μ²΄ μμ±νλ κ²μ λ§κΈ° μν΄μ Singleton κ°μ²΄μμλ μμ±μλ₯Ό μ νμ κ·Όμλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
Mainν¨μλ₯Ό μ€νν κ²°κ³Όλ λ μΈμ€ν΄μ€ λͺ¨λ κ°μ μΈμ€ν΄μ€μΈ κ²μ νμΈν μ μμ΅λλ€.
Sigleton λκΈ°ν
μ¬λ¬ μ°λ λμμ μ ν΄λμ€μ getInstance λ©μλλ₯Ό νΈμΆνκ² λλ©΄ λμμ μμ μ νκΈ° λλ¬Έμ instanceλ nullλ‘ νλ¨νμ¬ μ°λ λμμ νΈμΆν λ§νΌ μΈμ€ν΄μ€κ° μμ±ν κ²μ λλ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄ μΈμ€ν΄μ€ μμ± μ νλ² λ νμΈνλ λ°©λ²μ μ¬μ©νλλ° μ°λ λκ° λμμ μ κ·Όνμ§ λͺ»νλλ‘ λ λ²μ§Έ νμΈνκΈ° μ μ λ½μ κ±Έμ΄μ£Όλ κ²μ΄ μΌλ°μ μ΄λΌκ³ ν©λλ€.
1. Thread safe Lazy initialization
public static synchronized Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; }
λ©μλ μ 체μ μκ³μμμΌλ‘ μ€μ νμ¬ synchronizedλ₯Ό μΆκ°νλ κ²μ λΉκ΅μ ν° μ±λ₯μ νκ° λ°μνκΈ° λλ¬Έμ κΆμ₯νλ λ°©λ²μ μλλΌκ³ ν©λλ€.
2. Thread safe Lazy initialization + Double-checked locking
public static Singleton getInstance(){ if(instance == null){ synchronized(this){ if(instance == null){ instance = new Singleton(); } } } return instance; }
λκΈ°ν λΈλ λ΄λΆμ μΈμ€ν΄μ€ μ¬λΆλ₯Ό νμΈν ν μμ±νκ² λλ©΄ getInstanceλ₯Ό νΈμΆν λλ§λ€ synchronziedλ₯Ό μ¬μ©νκΈ° λλ¬Έμ μ±λ₯ μ νλ λΆκ°νΌν©λλ€. λ¨Όμ μΈμ€ν΄μ€ μ¬λΆλ₯Ό νμΈνκ³ λ λ²μ§Έ μΈμ€ν΄μ€ μ¬λΆ νμΈ μ μ λκΈ°νλ₯Ό νκ² λλ©΄ thread-safe νλ©΄μλ μ²μ μμ± μ΄νμλ synchronized λΈλμ κ±°μΉμ§ μκΈ° λλ¬Έμ μ±λ₯ μ νλ₯Ό μνν μ μμ΅λλ€.
3. Initialization on demand holder idiom (holderμ μν μ΄κΈ°ν)
public class Singleton{ private static class Holder{ public static final Singleton instance = new Singleton(); } public static Singleton getInstance(){ return Holder.instance; } }
κ°λ°μκ° μ§μ λκΈ°ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ°λ μ½μ§ μμ΅λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μλ λ§μ μμΈμ²λ¦¬μ ꡬ쑰 κ°μ λ€λ‘ μΈν΄ 볡μ‘ν΄μ§κ³ λΉμ©μ΄ μ»€μ§ μ μμ΅λλ€. λ§μ§λ§ λ°©λ²μ JVMμ ν΄λμ€ μ΄κΈ°ν κ³Όμ μμ 보μ₯λλ μμμ νΉμ±μ μ΄μ©νμ¬ μ±κΈν΄μ μ΄κΈ°ν λ¬Έμ λ₯Ό JVMμκ² μ± μμ λκΈΈ μ μμ΅λλ€.Holder ν΄λμ€ μμ μ μΈλ μΈμ€ν΄μ€κ° staticμ΄κΈ° λλ¬Έμ ν΄λμ€ λ‘λ©μμ μ νλ² νΈμΆλ κ²μ΄λ©° finalμ μ¬μ©νμ¬ κ°μ λ³κ²½νμ§ λͺ»νλλ‘ νμμ΅λλ€.
μ΄ λ°©λ²μ΄ κ°μ₯ λ§μ΄ μ¬μ©νκ³ μΌλ°μ μΈ Singleton ν΄λμ€ λ°©λ²μ΄λΌκ³ ν©λλ€.
λ°μν'Android > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] JVMμ΄λ? μλ° μ½λ μ€ν (0) 2021.01.11 [Java] λμμΈ ν¨ν΄(Decorator ν¨ν΄) (0) 2021.01.08 [Java] λμμΈ ν¨ν΄(Adapter ν¨ν΄) (0) 2021.01.07 [Java] λμμΈ ν¨ν΄ (Factory ν¨ν΄) (0) 2021.01.05 [Java] λμμΈ ν¨ν΄ (Builder ν¨ν΄) (0) 2021.01.03