Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • boj
  • Kubernetes
  • DFS
  • django
  • 프로그래머스
  • docker
  • BFS
  • 다이나믹 프로그래밍
  • Network
  • 백트래킹

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

Lang/Java

[디자인 패턴] 싱글톤 패턴 (Creational)

2022. 1. 10. 14:28

싱글톤(Singleton)

전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하고, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴

클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.

 

 

주의사항

  1. 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다.
    -> private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다.
  2. 다중 스레드에서 경합 조건(Race Condition)이 발생해 인스턴스가 2개 이상 생성되는 경우를 막아야 한다.

 

 

아래 코드는 위 주의사항을 잘 지킨 예시이다.

public class SingletonService {

    private static final SingletonService instance = new SingletonService();

    public static SingletonService getInstance() {
        return instance;
    }

    private SingletonService() {}
}

 

  1. static 영역에 객체 'instance'를 미리 하나 생성해서 올려둔다.
  2. 이 객체 인스턴스가 필요하면 'getInstance()' 메서드를 통해서만 조회할 수 있다.
    이 메서드를 호출하면 항상 같은 인스턴스를 반환한다.
  3. 딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는것을 막는다.

 

 

싱글톤 패턴을 구현하는 방법은 여러가지가 있다.

위 코드에서는 객체를 미리 생성해두는 가장 단순하고 안전한 방법을 선택했다.

 

 

 

아래 코드는 주의사항을 잘 지킨 또 다른 예시 코드이다.

public class SingletonService {

    private static SingletonService instance = null;
 
    public static synchronized SingletonService getInstance() {
        instance = new SingletonService();
        return instance;
    }
    
    private SingletonService() {
    }
}

 

  1. static 영역의 'instance' 객체를 null로 지정해둔다.
  2. 'getInstance()' 메서드로 'instance'객체를 가져올 수 있다.
    이때 경합 조건의 발생을 막기위해 synchronized를 사용해서 메서드를 동기화 시켜준다.
  3. 마찬가지로 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는것을 막는다.

 

'Lang > Java' 카테고리의 다른 글

[Java] Lambda 특징과 활용  (1) 2022.10.03
함수형 프로그래밍과 Java #1  (6) 2022.09.08
[Java] Runnable과 Thread의 차이  (0) 2021.12.11
[Java] 추상 클래스와 인터페이스 (abstract class & interface)  (0) 2021.10.13
[Java] Call by Reference? Call by Value!  (0) 2021.08.31
    'Lang/Java' 카테고리의 다른 글
    • [Java] Lambda 특징과 활용
    • 함수형 프로그래밍과 Java #1
    • [Java] Runnable과 Thread의 차이
    • [Java] 추상 클래스와 인터페이스 (abstract class & interface)

    티스토리툴바