[CS] 디자인 패턴 - 싱글톤 패턴
728x90

CS

오늘부터 Java를 공부를 안 할 때는 CS에 대해 블로그 글을 쓰려고 한다.
CS는 학부생일 때도 배우지 않아서 처음이지만 어느 정도 OOP에 대한 지식은 유니티로 게임 개발을 했기에 알고 있다.
하지만 지키기 쉽지 않았다. 왜 OOP를 해야 하고 테스트 코드를 작성해야 하고 나는 오늘부터 알아갈 생각이다.

 

CS 공부는 면접을 위한 CS 전공지식 노트를 참고했다.

 


용어

라이브러리

  1. 공통적으로 사용될 수 있는 특정한 기능들을 모듈화한 것.
  2. 프레임 워크에 비해 자유롭다!
  3. 예를 들면 요리를 할 때 '도구'인 '칼'을 사용해서 '내가'직접 컨트롤하여 자르는데, 라이브러리는 이와 비슷하다!

 

프레임워크

  1. 공통적으로 사용될 수 있는 특정한 기능들을 모듈화한 것.
  2. 폴더명, 파일명 등에 대한 규칙이 있어서 라이브러리에 비해 좀 엄격하다!
  3. 다른 곳으로 이동할 때 '도구'인 비행기를 타고 이동하지만 '비행기'가 컨트롤하고 나는 가만히 있어야 한다, 프레임워크는 이와 비슷하다!

디자인 패턴

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

 

1. 싱글톤 패턴 (singleton pattern)

  1. 싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴.
  2. 하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있지만, 그렇게 하지 않고
  3. 하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어 이를 기반으로 로직을 만드는 데 쓰임.
  4. 보통 DB 연결 모듈에 자주 사용된다.

1.1 싱글톤 패턴의 장/단점

장점 :

하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈이 공유하여

사용하기 때문에 인스턴스를 생성할 때 비용이 줄어든다.

 

단점 :

  1. 의존성이 높아진다.
  2. TDD(Test Dirven Development)를 할 때 걸림돌이 된다. 
    싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로
    각 테스트마다 '독립적인' 인스턴스를 만들기 어렵다

 

의존성 주입

싱글톤 패턴은 사용하기 쉽지만 모듈 간의 결합을 강하게 만들 수 있기에, 이때 의존성 주입(DI, Dependency Injection)을 통해 모듈 간의 결합을 조금 더 느슨하게 만들어 해결할 수 있다!

 

의존성 주입의 장점

  1. 모듈을 쉽게 교체할 수 있는 구조가 되어 테스팅하기 쉽고 마이그레이션하기도 수월하다.
  2. 모듈 간의 관계들이 조금 더 명확해진다.

 

의존성 주입의 단점

  1. 모듈들이 더욱 분리되므로 클래스 수가 늘어나 복잡성이 증가할 수 있다.
  2. 약간의 런타임 패널티가 발생할 수 있다.

 

의존성 주입 원칙

  1. 의존성 주입은 "상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 한다.
  2. 둘 다 추상화에 의존해야 한다. 이때 추상화는 세부 사항에 의존하지 말아야 한다.

 

싱글톤 패턴 예시

직접 작성하고 테스트를 한 싱글톤패턴이다.

public class Main {
	public static void main(String[] args) {
		Singleton instance = Singleton.getInstance();
		instance.TestSingleton();
	}
}

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

	public static Singleton getInstance() {
		return INSTANCE;
	}

	public void TestSingleton() {
    ...
	}
}

 

 

사실 의존성 주입이랑 싱글톤 패턴은 게임 제작할 때 많이 위배하는 것 같다.

실제로 다른 클래스를 인스턴스로 만들지 않고 싱글톤 패턴으로 만들어서 그냥 가져왔을 때 위의 경험을 직접 해보았다..

 

사실 아직도 잘 모르기 때문에 매번 반복해서 봐야겠다.

 

나는 C#에서 Managers 즉 데이터 관리 쪽은 Singleton 패턴을 만들고

UI나 기타 외부는 만들지 않고 사용하고 있다.

 

만약 외부 UI에 접근이 필요할 때는 매개변수를 통하여 클래스를 싱글톤으로 보내서 작업하는데

이게 의존성 주입을 잘 하고 있는 것인가? 에 대해서는 확신이 들지 않는다.

 

반복해서 봐야 할 수밖에 없다! 반복이 곧 답이다.

'Cs ( Computer Science ) > 디자인 패턴' 카테고리의 다른 글

[CS] 디자인 패턴 - 팩토리 패턴  (1) 2023.10.27