싱글톤(Singleton) 패턴

Heejeong Choi·2021년 10월 4일
0

웹개발

목록 보기
5/6

싱글톤 패턴

SW 디자인 패턴에서 싱글톤 패턴을 따르는 클래스는 생성자가 여러차례 호출 되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 형태이다.

대체로 서로 자원을 공유할 때 사용하는데, 현실에서는 프린터가 해당되고, 실제 프로그래밍에서는 TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용된다.


1. SocketClient 클래스

public class SocketClient {
   private static SocketClient socketClient = null;
   
   private SocketClient() {}
   
   public static SocketClient getInstance() {
      if(socketClient == null) {
         socketClient = new SocketClient();
         System.out.println("socket new instance");
      }
      
      return socketClient;
   }
   
   public void connect() {
      System.out.println("connect");
   }
}

2. 첫번째 클래스와 두번째 클래스

public class FirstClazz {
   public SocketClient getSocketClient() {
      return socketClient;
   }
   
   public void setSocketClient() {
      this.socketClient = socketClient;
   }
   
   private SocketClient socketClient;
   
   public FirstClazz() {
      this.socketClient = SocketClient.getInstance();
   }
}



public class SecondClazz {
   public SocketClient getSocketClient() {
      return socketClient;
   }
   
   public void setSocketClient() {
      this.socketClient = socketClient;
   }
   
   private SocketClient socketClient;
   
   public SecondClazz() {
      this.socketClient = SocketClient.getInstance();
   }
}

3. 메인 클래스

public class Main {
   public static void main(String[] args) {
      FirstClazz firstClazz = new FirstClazz();
      SecondClazz secondClazz = new SecondClazz();
      
      SocketClient firstClient = firstClazz.getSocketClient();
      SocketClient secondClient = secondClazz.getSocketClient();
      
      System.out.println("두개의 객체가 동일한가?");
      System.out.println(firstClient.equals(secondClient));
   }
}

왜 싱글톤 패턴을 사용할까?

아무래도 싱글톤 패턴이라고 한다면, 우리가 위에서 코드를 작성해왔던 것 처럼 "하나의 인스턴스"라는 것이 떠오를 것 같다. 근데 그래서, 한개의 인스턴스로만 가져가면 뭐가 좋길래 싱글톤을 쓰는거야?

무엇보다도 메모리를 아낄 수 있는점이 가장 큰 이유 일 것 같다. new 연산자를 한번만 사용하기 때문에, 고정된 메모리 영역을 낭비하지 않아도 된다. 뿐만아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다고 볼 수 있다.

또한, 하나의 객체를 선언 후 get/set을 이용하기 때문에 데이터 공유가 용이하다는 점이다. 싱글톤 인스턴스가 전역으로 사용되는 인스턴스라서 다른 클래스의 인스턴스들이 접근해 사용할 수 있다. 하지만, 데이터가 동시 접근이 가능해 동시성 문제가 발생 할 수 있으므로 이 점을 유의하여 개발하는 것이 중요하다.

자, 그렇다면 싱글톤은 장점만 있는걸까?

그.럴.리.가!!! 우선 무엇보다도 싱글톤으로 코드를 구현시, 코드 자체가 많이 필요하다. 또한 테스트도 쉽지 않다. 이 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화 시켜 테스트를 진행해야 한다.

뿐만아니라, 자식클래스를 만들수 없다는 점과, 내부 상태를 변경하기 어렵다는 점 등 여러가지 문제들이 존재한다. 결과적으로 이러한 문제들을 안고있는 싱글톤 패턴은 유연성이 많이 떨어지는 패턴이라고 할 수 있다.


싱글톤 패턴이란?

싱글톤 패턴

profile
Welcome to my velog! I love learning something new to build up my ability in development field. I don't think it is shame not to know, but it is shame to pretend to know about something you don't know.

0개의 댓글