코드짜는 노인네

[ComputerScience(CS)] 디자인 패턴 - 싱글톤 패턴 (Singleton pattern) 본문

Computer Science (CS)

[ComputerScience(CS)] 디자인 패턴 - 싱글톤 패턴 (Singleton pattern)

ikohong 2022. 9. 25. 01:37
728x90
반응형

[ComputerScience(CS)] 디자인 패턴 - 싱글톤 패턴 (Singleton pattern)


신입 개발자가 되기 위해 많은 부분을 준비해야됩니다. 협업을 통해 여러기술을 막 사용해보았지만, 이해를 하지 않고, 기술 면접을 딱 할려고 하니, 입이 떨어지지 않아, 기초부터 다시 준비를 해야겠다는 생각을 했습니다. 그 중 CS(Computer Science) 준비를 해야된다는 이야기를 들어 블로그에 정리를 하면서 공부를 시작해볼까 합니다.


디자인 패턴 (Design pattern)


싱글폰 패턴을 알기전에 디자인 패턴이라는것부터 알아야됩니다.

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

이렇게 작성을 해도 무슨 이야기인지 잘 모르겠다. '싱글톤 패턴'을 알아보면서 이 뜻을 이해해야될꺼 같다.

반응형

싱글톤 패턴 (Singleton pattern)


싱글톤 패턴이란?
> 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴

이렇게 접근을 하니 '인스턴스'라는 단어부터 정확히 알고 가야될꺼 같다.


■ 인스턴스
> 설계도를 바탕으로 소프트웨어 세계를 구현된 구체적인 실체
public class Car {
...
}

public class Main {
    public static void main(String[] args) {
        Car Kia;  // 객체
        
        Kia = new Car();  // Kia는 Car 클래스의 '인스턴스' (객체를 메모리에 할당)
    }
}

객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다. 위의 코드를 보면 'new' 명령문을 이용하여, Car 클래스를 메모리에 생성되었다. 여기서 Kia는 Car 클래스의 '인스턴스'라고 한다.


그런데 이 싱글톤 패턴은 왜 사용할까?

바로 메모리 낭비를 방지하기 위함이다. 객체를 생성할 때마다 메모리 영역을 할당받아야하는데, 하나의 클래스에 하나의 인스턴스만 생성하는 '싱글톤 패턴'을 사용하게되면 하나의 인스턴스를 만들고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기에 인스턴스를 생성할 때 메모리 누스를 방지할 수 있는 장점을 가지고 있다.

싱글폰 패턴은 언제 많이 사용하냐?
> 보통은 데이터베이스 연결할 경우 많이 사용한다고 합니다.
싱글톤 패턴 예시
class Singleton{
	String color;
    private static class singleInstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    
    // synchronized를 사용한 이유는 여러 쓰레드에서 해당 인스턴스를 요청이 들어왔을경우 순서대로 처리를 위함
    // '동시성 제어'를 위함
    public static synchronized Singleton getInstance() {
        return singleInstanceHolder.INSTANCE;
    }
    
    private Singleton(){
    // 다른곳에서 해당 클래스의 인스턴스를 생성못하도록 하고 싶다면, 해당 코드를 작성하면 된다.
    }
}

public class Instance {
    public static void main(String[] args) {
        Singleton a = Singleton.getInstance();
        Singleton b = Singleton.getInstance();
        
        a.color = "white";
        b.color = "black";
        
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        
        System.out.println(a.color);
        System.out.println(b.color);

        System.out.println(a == b);
    }
}

위의 코드는 예시로 'Singleton'클래스에 하나의 인스턴스를 생성하고 해당 클래스의 'getInstance()'메소드를 이용하여 해당 인스턴스를 가져오는 방법입니다. a,b의 hashCode(객체의 주소값을 반환하여 생성한 객체의 고유한 정수값)를 보면, 값이 같은것을 확인할 수 있으며, a,b의 color값을 변경하였지만, 결과는 'black''만 나오는 모습을 확인할 수 있다.

상글톤 패턴 단점

꼭 장점만을 가지고 있는것은 아니다. 단점을 한번 확인해보자!

  • TDD (Test Driven Development)중 단위 테스트를 할 경우, 서로 독립적이여야하며, 테스트를 어떤 순서로도 실행을 할 수 있어야 한다.
    > 허나, '싱글톤 패턴'의 경우 이미 생성된 하나의 인스턴스만 사용하기에, 테스트마다 독립적인 인스턴스를 만들기가 어렵다.
  • 모듈간의 결합을 강하게 만든다.
    > 이럴경우 의존성 주입 (DI, Dependency Injection)을 통해 모듈간의 결합을 느슨하게 만들어 해결!
728x90
반응형

'Computer Science (CS)' 카테고리의 다른 글

[ComputerScience(CS)] 디자인 패턴 - MVC 패턴  (0) 2022.09.25
Comments