DESIGN PATTERN

[디자인패턴] 싱글톤패턴(singleton Pattern) 이란? (+static) - 개발자 배찌

개발자 배찌 2022. 4. 14. 10:18
728x90

😀싱글톤 패턴
전역변수를 사용하지 않고, 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴.
객체의 인스턴스가 오직 1개만 생성되는 패턴.
애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(static), 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴.


😀싱글톤 패턴 장점
고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음.
두번째 이용시 부터는 객체 로딩시간이 현저하게 줄어 성능이 좋아진다.

😀싱글톤 패턴 단점
멀티스레딩 환경에서 동시성문제가 발생할 수 있다. 동시성 문제를 해결하기 위해 syncronized 키워드를 사용해야 한다.
테스트하기 어렵다. 싱글톤 인스턴스는 자원을 공유하기때문에 매번 인스턴스 상태를 초기화 시켜주어야한다.
싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄원칙"을 위배하게 된다. => SOLID에서 OCP위반 (open-closed prinsiple)

😀코드로 알아보기
Singleton.java

package study.singletonPattern.code0;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Singleton {

    private static Singleton instance;

    //생성자에 직접 접근하지 못하게 private으로..
    private Singleton(){
        run();
    }

    public static Singleton getInstance(){
        if(instance == null){
            //synchronized를 활용하여 멀티스레드 환경에서 여러 인스턴스 생성하는것을 방지
            synchronized (Singleton.class){
                if(instance == null) instance = new Singleton();
            }
        }
        return instance;
    }

    void run(){
        log.info("실행!!!");
    }
}


SingletonPattern.java

package study.singletonPattern;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import study.singletonPattern.code0.Singleton;

@Slf4j
public class SingletonPattern {
    @Test
    void code0test(){
        Singleton.getInstance().getClass();

        Singleton.getInstance().getClass();
    }
}



😀static(정적) 이란?
static 키워드를 사용하여 static변수(정적필드)와 static메소드(정적메소드)를 만들 수 있다.
이 둘을 합쳐 정적 멤버라고한다. (클래스멤버 라고도 한다)

static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 static영역에 할당된다.
static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만
Garbage collector의 관리 영역 밖에 존재하기 때문에 static 영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된채로 존재하게된다. 그렇기에 static을 너무 남발하게 되면 만들고자 하는 시스템성능에 악영향을 줄 수 있다.

참고블로그 : https://coding-factory.tistory.com/524

[Java] 자바 static의 의미와 사용법

정적(Static)이란? 정적(static)은 고정된이란 의미를 가지고 있습니다. Static이라는 키워드를 사용하여 Static변수와 Static메소드를 만들 수 있는데 다른말로 정적필드와 정적 메소드라고도 하며 이

coding-factory.tistory.com