[CS]디자인 패턴 : 싱글톤 패턴

김피자·2023년 1월 20일
0

CS

목록 보기
1/22
post-thumbnail

1.1 디자인 패턴

: 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 "규약"형태로 만들어 놓은 것

1.1.1 싱글톤 패턴(Singleton Pattern)

: 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴
: 객체의 인스턴스가 오직 1개만 생성되는 패턴
: 보통 DB연결 모듈에 많이 사용

장점

장점 1) 데이터 공유

하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하여 사용하할 수 있다 > 인스턴스 생성 비용이 줄어든다.
> 하지만!! 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생한다.
단점 : 의존성이 높아진다.

장점2) 메모리 측면

최초 한번의 new연산자를 통해 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다.
> 이미 생성된 인스턴스를 활용하니 속도가 빠르다.

단점

단점1) 코드 자체가 많이 필요

정적 팩토리 메소드에서 객체 생성을 확인하고 생성자를 호출하는 경우에 멀티스레팅 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야한다.

단점2) 테스트 어려움

싱글톤 패턴은 TDD(Test Driven Development:테스트 주도 개발)를 할 때 걸림돌이 된다. TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야한다. 하지만, 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 독립된 인스턴스를 만들기가 어렵다.

+ 추가) 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 격리된 상황에서 수행되려면 인스턴스의 상태를 초기화 시켜주어야 한다.
그렇지 않으면 애플리케이션 전역에서 상태를 공유하기 때문에 테스트가 온전하게 수행되지 못한다.

단점3) 의존성 문제

모듈 간의 결합을 강하게 만들 수 있다는 단점이 있다.
new 키워드를 직접 사용하여 클래스 안에서 객체를 생성하는데 이는 SOLID 원칙(객체지향설계 5원칙) 중 DIP를 위반하게되고, OCP원칙 또한 위반할 가능성이 높다.

의존성 주입(DI, Dependency Injection)을 통해 모듈 간의 결합을 조금 더 느슨하게 만들어 해결할 수 있다.

이외에도 자식클래스를 만들 수 없다는 점, 내부 상태를 변경하기 어렵다는 점 등 여러 문제가 존재한다.

자바에서의 싱글톤 패턴

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

	public static Singleton getInstance() {
		return singleInstanceHolder.INSTANCE;
	}
}
/* 70597765
 * 70597765
 * true */

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

profile
제로부터시작하는코딩생활

0개의 댓글