JAVA / static 응용 - 싱글톤 패턴(singleton pattern)

아몬드봉봉·2023년 12월 12일
0

Java

목록 보기
11/17

싱글톤 패턴

  • 프로그램에서 객체의 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
  • static변수, 메서드를 활용하여 구현할 수 있음
  • 생성자의 호출이 반복적으로 이뤄져도 실제로 생성되는 객체는 최초 생성된 객체를 반환해 주는 것

사용 이유

  • 한 번의 객체 생성으로 재 사용이 가능하기 때문에 메모리 낭비를 방지할 수 있다.
  • 다른 클래스 간에 데이터 공유가 쉽다.
  • 도메인 관점에서 인스턴스가 한 개만 존재하는 것을 보증하고 싶은 경우 사용한다.

문제점

  • 객체의 역할이 복잡한 경우 싱글톤 객체를 사용하는 다른 객체 간의 결함도가 높아져서 객체 지향 설계 원칙에 어긋난다.
  • 패턴을 구현하는 코드 자체가 많이 필요하다.
    • 정적 팩토리 메서드에서 객체 생성을 확인하고 생성자를 호출하는 경우 멀티 스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야 함.
  • 테스트 하기 어렵다.
    • 애플리케이션 전역에서 상태를 공유하기 때문에 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화시켜주어야 한다.
  • 의존 관계상 클라이언트가 구체 클래스에 의존하게 된다.
    • new 키워드를 직접 사용하여 클래스 안에서 객체를 생성하고 있으므로, 이는 SOLID원칙 중 DIP를 위반하게 되고 OCP 원칙 또한 위반할 가능성이 높다.

싱글톤 패턴 예제

public class Company {
 
 	// 클래스 내부에 유일한 private 인스턴스 생성
    private static Company instance = new Company();
    
    // 생성자는 private로 선언
    private Company() {
    }
    
    // 외부에서 유일한 인스턴스를 참조할 수 있는 public 메서드 제공
    public static Company getInstance() {
        
        if (instance == null) {
            instance = new Company();
        }
        
        return instance;
    }
    
}
 
-----------------------------------------------------------
 
public class CompanyTest {
 
    public static void main(String[] args) {
        
        Company company1 = Company.getInstance();
        Company company2 = Company.getInstance();
        
        System.out.println(company1);
        System.out.println(company2);
        
//        Calendar cal = Calendar.getInstance();
    }
 
}

출처

https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
https://elfinlas.github.io/2019/09/23/java-singleton/

profile
성장을 즐기는 백엔드 자바 개발자

0개의 댓글

관련 채용 정보