본문 바로가기
CS

[CS] 1-1. 싱글톤 패턴 (singleton pattern)

by 개발하는 감자입니다 2024. 1. 10.
728x90

안녕하세요. 개발감자입니다.

오늘은 싱글톤 패턴에 대해서 이야기해보겠습니다.

1. 싱글톤 패턴 

1-1. 싱글톤 패턴이란?

하나의 클래스에서 오직 하나의 인스턴스만 가지는 패턴입니다.

 

1-2. 싱글톤 패턴 코드

1) 코드 1

class Singleton {

    private static class SingleInstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingleInstanceHolder.INSTANCE;
    }
}

public class HelloWorld {
    public static void main(String[] args) {
        Singleton a = Singleton.getInstance();
        Singleton b = Singleton.getInstance();
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        if (a == b) {
            System.out.println("a == b");
        }
    }
}

 

private static은 정적으로 1개만 할당해준다는 의미를 가지고 있습니다.

그래서 a,b에 싱글톤에 대한 객체를 생성해도 똑같은 인스턴스를 가르킵니다.

싱글톤 - 결과 화면

 

2) 코드 2

class Singleton{
    private singleton () {};
    private static Singleton singleton = null;
    
    public static Singleton getSingleton(){
        if (singleton == null){
            singleton = new Singleton();
            
        }
        return  singleton;
    }
}

 

이 코드는 일단 singleton 객체를 Null로 생성합니다. 어떤 부분에서 이미 싱글톤 객체를 한 번 생성했다면, 나중에 불러올 때에는 생성한 객체를 사용하게 되는 코드입니다. singleton == null 이 객체 생성을 확인하는 부분입니다.

 

2. 싱글톤 패턴의 사용 사례

앱이나 프로젝트를 하다보면 하나의 객체만 생성되어야 할 때가 있습니다.

예를 들면, 다크 모드 설정이 있습니다. 어떤 페이지에 있든 다크 모드 설정을 하면 모든 페이지에서 다크모드가 설정되어야 합니다. 또한, 데이터 베이스 연결 모듈에 많이 사용됩니다.

 

3. 싱글톤 패턴의 장단점

3-1. 싱글톤 패턴의 장점

1) 싱글톤 패턴은 사용하기가 쉽고 굉장히 실용적입니다.

2) 인스턴스를 생성할 때에 드는 비용이 줄어듭니다. 하나의 인스턴스를 만든 다음에 다른 모듈들이 공유해서 사용하면 되기 때문입니다.

 

3-2. 싱글톤 패턴의 단점

1) 하나의 인스턴스만 사용하기 때문에 의존성이 높아진다는 단점이 있습니다.

또한, TDD(Test Driven Development)를 할 때 문제가 됩니다. TDD는 단위 테스트를 주로 하며, 이 때 테스트가 서로 독립적어야 합니다. 하지만, 싱글톤 패턴은 하나의 인스턴스를 공유하며 사용하기 때문에 독립적일 수가 없습니다.

 

2) 모듈 간의 결합을 강하게 만들 수 있습니다. 

이는 의존성 주입 (DI)를 통해 모듈 간의 결합을 조금 더 느슨하게 만들어 해결할 수 있습니다.

 


오랜만에 자바를 보니 재미있는데요. 다른 패턴을 이해하기 위해서 싱글톤 패턴의 이해는 필수적이라고 생각합니다.

코드를 뜯어보며 왜 이런 패턴을 가질 수 있게 되는지 이해해보는 시간을 가져보시길 바랍니다.

 

그럼 더 유익한 이야기로 돌아올게요. 개발감자였습니다 :)
728x90
반응형