생성 패턴 : 싱글톤 패턴

Enini·2022년 7월 6일
1

깊게 공부하기

목록 보기
4/4

1. 생성 패턴

생성 패턴 중 싱글톤 패턴에 대해 알아보려고 한다.

먼저 생성 패턴이란

객체 인스턴스를 생성하는 패턴으로, 클라이어튼와 그 클라이언트가 생성해야 하는 객체 인스턴스 사이의 연결을 끊어 주는 패턴이다.

특징으로는
1. 시스템이 어떤 구체적인 클래스를 사용하는지에 대한 정보를 캡슐화한다.
2. 이들 클래스의 인스턴스들이 어떻게 만들고 어떻게 서로 맞붙는지에 대한 부분을 완전히 가린다.
-> 객체의 생성과 조합을 캡슐화해 특정 캑체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.

2. 싱글톤 패턴(singleton pattern)

하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다.
보통 데이터베이스 연결 모듈에 많이 사용한다.

자바 코드

class Singleton {
	private static class singleInstanceHolder {
    	private static final Singleton INSTANCE = new Singleton();
    }
    public static synchronized 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(true);
        }
    }
}
705927765
705927765
true

3. 싱글톤 패턴의 장점

  1. 메모리
    위의 코드 셋 째줄 중 최초 한 번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다.

  2. 데이터 공유가 쉬움
    싱글톤 인스턴스는 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다. but! 여러 클래스의 인스턴스가 싱글톤 인스턴스의 데이터에 동시에 동시 접근하면 동시성 문제가 발생할 수 있다.

4. 싱글톤 패턴의 단점

  1. 구현 코드 자체가 많이 필요함

  2. TDD 어려움 (Test Driven Development)
    TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는 서로가 독립적이어야 하며 테스트를 어느 순서로든 실행할 수 있어야 한다. 하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하기 때문에 각 테스트마다 '독립적인' 인스턴스를 만들기가 어렵다.

  3. 모듈 간의 결합
    인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 의존성이 높아진다.
    이 때 의존성 주입을 통해 모듈 간의 결합을 느슨하게 만들 수 있다.

5. 의존성 주입

그림의 왼쪽처럼 메인 모듈이 '직접' 다른 하위 모듈에 대한 의존성을 주기보다 오른쪽처럼 의존성 주입자가 대신 의존성을 줘서 메인 모듈이 '간접적'으로 의존성을 주입하는 방식이다.
이처럼 의존성을 주입하면 메인 보듈은 하위 모듈에 대한 의존성이 떨어지게 된다. ('디커플링이 된다' 라고 말함)

  • 장점
    모듈들을 쉽게 교체할 수 있는 구조가 되서 테스트 하기 쉽다.
    의존성 방향이 일관된다.
    모듈 간의 관계들이 조금 더 명확해진다.

  • 단점
    더 분리되었기 때문에 클래스 수가 늘어나 복잡성이 증가될 수도 있다.
    약간의 런타임 페널티가 생긴다.

  • 원칙
    상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않는다.
    둘 다 추상황에 의존해야 하며, 이 때 추상화는 세부 사항에 의존하지 않는다.

의존성이란 종속성이라고도 하며 A가 B에 의존성이 있다는 것은 B의 변경 사항에 대해 A 또한 변해야 된다는 것을 의미한다.

[출처]한빛출판네트워크

profile
안녕하세요! 만나서 반갑습니다!

0개의 댓글