본문 바로가기
public void static main()/Design Pattern

[Design Pattern] Singleton Pattern

by 햄리뮤 2021. 11. 2.
반응형

아 진짜 오랜만에 공부한다 11월 시작부터 열심히다~

아자아자 리마 파이팅

오늘은 디자인 패턴에 Singleton Pattern을 공부할꺼다! 왜냐면 내일 인강 들을꺼니까!

 

[출처] https://refactoring.guru/design-patterns/singleton

싱글톤 패턴이 뭘까?

- 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.

음... 쫌더 알아보자!

- 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴!

 

생성자가 여러차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다. (자바에서는 생성자를 private로 선언해서 생성 불가하게 하고 getInstance()로 부르게함!)

 

다시말해서 인스턴스가 필요 할 때 똑같은 인스턴스를 만들어 내는 것이 아니라, 동일 인스턴스를 사용하게 한다는 것!

객체를 미리 생성해두고 가져오는 가장 단순하고 안전한 방법!

public class Singleton {

    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
    }

    public static Singleton getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("hi, there");
    }
}

싱글톤 패턴 쓰는 방법은?

Eager Initialization (이른 초기화, Thread-safe)

- static 키워드의 특징을 이용해서 클래스 로더가 초기화 하는 시점에서 정적 바인딩(static binding)을 통해 해당 인스턴스를 메모리에 등록해서 사용하는 것!

  이른 초기화 방식은 클래스 로더에 의 클래스가 최초로 로딩 될 때 객체가 생성되기 떄문에 Thread-safe 하다!

  싱글톤 구현 시 중요한 점이 멀티 스레딩 황경에서도 동작 가능하게끔 구현 해야한다는 것! Thread-safe가 보장 되어야한다!

후... 한 70퍼센트 알아들은듯..

Lazy Initialization with synchronized(동기화 블럭, Thread-safe)

- 인스턴스가 필요한 시점에 요청하 동적 바인딩(Dynamic binding) 을 통해 인스턴스를 생성하는 방식

 

 

💥Thread-safe..?

- 멀티스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다.

좀더 자세히 말하면! 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것을 말함!

 

💥여기서 잠깐..! 정..적..바인디...ㅇ?? 동적 바인딩이 머..야?

정적 바인딩 - 컴파일 전에 미리 알 수 있는 것

=> 오버로딩(컴파일 과정에서 어떤 메서드를 호출할지 결정되기 때문에!)

동적 바인딩 - 실제 실행을 시켜봐야 알 수 있는 것/프로그램이 실행돼도 변하지 않음

=> 오버라이딩(실행 시간에 어떤 메서드를 호출할지가 정해지기 때문에!)

 

그렇다면...

싱글톤 패턴을 사용해야하는 이유는?

- 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다!

- 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음! 

- 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있대!

 

문제점은 없을까?

- 싱글톤 인스턴스가 너무 많은  일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙(OCP)"을 위배하게 된다.

(객체 지향 설계 원칙에 어긋남!) => 수정, 테스트가 어려워진다 (´。_。`)

=> 테스트할때 매번 인스턴스의 상태를 초기화시켜주어야 한다. 그렇지 않으면 어플리케이션 전역에서 상태를 공유하기 때문에 테스트가 온전하게 수행되지 못한다... ㅠㅠ

가수 솔리드

- 의존 관계상 클라이언트가 구체 클래스에 의존하게 된다. new키워드를 직접 사용하여 클래스 안에서 객체를 생성하고 있으므로, 이는 SOLID 원칙중 DIP를 위반하게 되고 OCP원칙 또한 위반할 가능성이 높다.

- 자식클래스를 만들수 없고, 내부 상태도 변경하기 어렵다.

문제점 왜이렇게 많아~?

 

그래서 결론이뭐야?

스프링 컨테이너 같은 프레임워크의 도움을 받으면 싱글톤 패턴의 문제점들을 보완하면서 장점의 혜택도 누릴 수 있다!

실제로 스프링 빈은 컨테이너의 도움을 받아 싱글톤 스콥으로 관리되고 있다!

 

결론: 싱글톤 패턴은 스프링으로 쓰자^^

 

 

공부에 도움을 주신 모든 분들 너무너무 감사합니다!덕분에 또 하나 알아가요!

 

https://webdevtechblog.com/%EC%8B%B1%EA%B8%80%ED%84%B4-%ED%8C%A8%ED%84%B4-singleton-pattern-db75ed29c36

 

싱글턴 패턴(Singleton Pattern)

자바와 스프링의 싱글턴 패턴(Singleton Pattern)과 차이점

webdevtechblog.com

https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/

 

싱글톤(Singleton) 패턴이란?

이번 글에서는 디자인 패턴의 종류 중 하나인 싱글톤 패턴에 대해 알아보자. 싱글톤 패턴이 무엇인지, 패턴 구현 시 주의할 점은 무엇인지에 대해 알아보는 것만으로도 많은 도움이 될 것이라

tecoble.techcourse.co.kr

https://jeong-pro.tistory.com/86

 

싱글톤 패턴(Singleton pattern)을 쓰는 이유와 문제점

싱글톤 패턴(Singleton Pattern) 싱글톤 패턴 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴. 생성자가 여러

jeong-pro.tistory.com

https://sorjfkrh5078.tistory.com/87

 

[JAVA] 정적 바인딩(Static Binding) vs 동적 바인딩(Dynamic Binding)

이전 오버로딩(Overloading)과 오버라이딩(Overriding)을 공부할 때 오버로딩은 정적 바인딩되고 오버라이딩은 동적 바인딩된다고 하였다. 그렇다면 여기서 말하는 바인딩은 무엇일까? 이에 대해서 한

sorjfkrh5078.tistory.com

https://gompangs.tistory.com/entry/OS-Thread-Safe%EB%9E%80

 

[OS] Thread Safe란?

Thead Safe 스레드 안전(thread 安全, 영어: thread safety)은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에

gompangs.tistory.com

 

 

 

 

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의들은

내용이 정리가 되었습니다.

그림들은 그림밑에 출저표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글