1128 TIL: 싱글톤 패턴

hjern·2023년 11월 28일
0

TIL

목록 보기
6/8

디자인 패턴

📌 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 ‘규약’ 형태로 만들어 놓은 것.
  1. 싱글톤 패턴(Singleton pattern)

    📌 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴으로, 보통 데이터베이스 연결 모듈에 많이 사용됨. 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스 생성 시 비용이 절감. 다만, 의존성이 높아짐.
    class Singleton {
        private static class singleInstanceHolder {
            private static final Singleton INSTANCE = new Singleton();
        }
        public static 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
    • 싱글톤 패턴의 단점
      TDD(Test Driven Development)에 걸림돌이 됨. 단위 테스트를 주로 하는데, 서로 독립적이며 어떤 순서로든 실행할 수 있어야 하기 때문이지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이다 보니 테스트마다 ‘독립적인’ 인스턴스를 만들기가 어려움.

    • 의존성 주입
      싱글톤 패턴의 단점 즉, 모듈 간의 결합이 강하다는 특징을 의존성 주입을 통해 결합을 느슨하게 만들면서 해결할 수 있음. 메인 모듈이 ‘직접’ 다른 하위 모듈에 대한 의존성을 주기 보다는, 중간에 의존성 주입자가 이 부분을 가로채 ‘간접’적으로 의존성을 주입. 디커플링.

    • 의존성 주입의 장단점
      애플리케이션 의존성 방향이 일관되고, 애플리케이션을 쉽게 추론할 수 있으며, 모듈 간의 관계들이 조금 더 명확해지나 모듈이 더욱더 분리되므로 클래스 수가 늘어나 복잡성이 증가될 수 있으며 약간의 런타임 패널티가 발생함.

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

    • 용어
      1. 클래스(class)
      : 객체(object)를 만들어 내기 위한 틀이며 만들어낼 객체의 속성과 메서드의 집합을 담아 놓은 것
      2. 객체
      :클래스로부터 만들어지는 실체. 클래스로 선언된 변수를 객체라고 한다.
      3. 인스턴스(instance)
      :객체가 메모리에 할당이 된 상태이며 런타임에 구동되는 객체를 말한다. 객체와 같은 의미로 쓰이기도 하지만 엄밀히 말해서 다르다. AWS의 클라우드 가상서버란 의미이기도 함.
    public static void main(String[] args) {
    	Person a = new Person(); // 객체 > 인스턴스
        a.levelup();
        
        Person b; // 객체
        b = new Person("홍철", 1, 1000); // 메모리에 할당 - 인스턴스화
        b.levelup();
        }

    참고자료
    면접을 위한 CS 전공지식 노트
    클래스와 객체, 인스턴스의 차이가 뭔가요?

profile
주니어는 언제 될 것인가

0개의 댓글