싱글톤

2024. 6. 23. 23:14·Java

 

애플리케이션 전체에서 단 한개의 객체만 생성해서 사용하고 싶다면 싱글톤 패턴을 적용할 수 있다.

싱글톤 패턴의 핵심은 생성자를 private로 선언해 외부에서 new 연산자로 생성자를 호출할 수 없게 하는 것이다.

생성자를 호출할 수 없으니 외부에서 객체를 생성하는 것이 불가능해진다. 대신 싱글톤 패턴이 제공하는 정적 메서드를 통해

간접적으로 객체를 생성할 수 있다.

package ch06.sec15;

public class Singleton {
    // private 접근 권한을 갖는 정적 필드 선언과 초기화
    private static Singleton singleton = new Singleton(); // **1번**

    // private 접근 권한을 갖는 생성자 선언
    private Singleton() {
    }

    // public 접근 권한을 갖는 정적 메소드 선언
    public static Singleton getInstance() {  // **2번**
        return singleton;
    }
}

 

**1번** 에서는 자신의 타입으로 정적 필드를 선언하고 미리 객체를 생성해서 초기화 시킨다. 그리고 private 접근 제한자를 붙여

외부에서 정적 필드값을 변경하지 못하도록 막는다.

 

**2번** 에서는 정적 필드값을 리턴하는 getInstance() 메서드를 public으로 선언했다.

외부에서 객체를 얻는 유일한 방법은 getInstance 메서드를 호출하는 것이다. 메서드가 리턴하는 객체는 정적 필드가 참조하는

싱글톤 객체이다.

 

package ch06.sec15;

public class SingletonEx {
    public static void main(String[] args) {

//        Singleton obj1 = new Singleton();
//        Singleton obj2 = new Singleton();  // 컴파일 에러

        // 정적 메소드를 호출해서 싱글톤 객체를 얻음

        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();

        // 동일한 객체를 참조하는지 확인
        if (obj1 == obj2) {
            System.out.println("같은 싱글톤 객체입니다.");
        } else {
            System.out.println("다른 싱글톤 객체입니다.");
        }
    }
}

 

new 연산자로 객체를 호출할 수 없다. (컴파일 에러 발생)

따라서 아래 코드에서는 obj1과 obj2는 같은 객체를 참조하게 되는것이다.

인스턴스는 하나만 생성된다.

 

싱글톤 패턴의 구현방법 중 eagger, lazy, double-checked locking 등 다양한 방법이 있는데

일단 오늘은 구현방법은 넘어가고..

 

싱글턴 패턴의 장점

1. 애플리케이션 전역에서 동일한 인스턴스를 사용할 수 있음

2. 단일 인스턴스를 사용하기 때문에 메모리를 절약할 수 있음

3. 인스턴스 생성과 초기화 로직을 한곳에서 제어할 수 있음

 

단점

1. 전역에서 사용되기 때문에 유닛테스트 어려움

2. 코드 내에서 싱글톤에 의존하는 부분이 명확하지 않아 리팩터링 어려움 있을 수 있음

3. 똑바로 쓰지 않으면 멀티쓰레드 환경에서 문제 생길 가능성 있음

'Java' 카테고리의 다른 글

중첩 클래스 / 인스턴스 멤버 클래스 / 정적 멤버 클래스  (0) 2024.07.05
인터페이스 - private 메소드  (0) 2024.07.01
Getter / Setter  (0) 2024.06.23
이것이 자바다 - 클래스(2)  (0) 2024.06.21
이것이 자바다 - 클래스  (0) 2024.06.19
'Java' 카테고리의 다른 글
  • 중첩 클래스 / 인스턴스 멤버 클래스 / 정적 멤버 클래스
  • 인터페이스 - private 메소드
  • Getter / Setter
  • 이것이 자바다 - 클래스(2)
공부처음하는사람
공부처음하는사람
  • 공부처음하는사람
    lazzzykim
    공부처음하는사람
  • 전체
    오늘
    어제
    • 분류 전체보기 (129)
      • Kotlin (31)
      • Java (55)
      • Spring (20)
      • Algorithm (3)
      • TroubleShooting (1)
      • 내일배움캠프 프로젝트 (14)
      • Setting (2)
      • ... (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 인기 글

  • 태그

    생성자 주입
    언체크예외
    Di
    다형성
    kotlin
    제네릭
    OCP
    중첩클래스
    김영한의 실전 자바
    배열
    내일배움캠프
    spring
    캡슐화
    java
    래퍼클래스
    김영한
    빈 생명주기
    김영한의 실전자바
    @Component
    싱글톤
  • hELLO· Designed By정상우.v4.10.3
공부처음하는사람
싱글톤
상단으로

티스토리툴바