1)디자인패턴-생성패턴_Singleton

hams·2023년 2월 28일
2

cs스터디

목록 보기
3/10

1) 생성패턴

  • 추상팩토리
  • 빌더
  • 팩토리 메서드
  • 프로토타입
  • 싱글톤

싱글톤 패턴

싱글톤 패턴이란 무엇인가?

싱글톤 패턴은 오직 하나의 객체만을 생성하도록 보장하는 디자인 패턴입니다. 즉, 어떤 클래스가 최초 한 번만 메모리를 할당하고 (static) 그 메모리에 인스턴스를 만들어 사용하는 패턴입니다. 이렇게 하면 프로그램 전역에서 해당 인스턴스에 접근할 수 있으므로, 전역 변수를 사용하는 것보다 훨씬 안전한 방법으로 객체를 사용할 수 있습니다.

싱글톤 패턴의 구현 방법은?

싱글톤 패턴을 구현할 때는, 객체 생성자를 private으로 선언하고, 유일한 객체를 반환하는 정적 메소드를 구현하는 것이 일반적입니다. 이렇게 하면, 외부에서 해당 클래스의 인스턴스를 생성할 수 없으므로, 유일한 인스턴스를 보장할 수 있습니다.

전역 변수를 사용한 예시 (JS)

// 전역 변수로 선언된 logger
const logger = new Logger();

// 로그 기록
function log(message) {
  logger.log(message);
}

// 다른 파일에서도 logger에 접근 가능
function otherFunction() {
  logger.log('Hello, world!');
}

위 예시에서 logger변수는 전역 변수로 선언되어 있으므로, 어디서든지 접근 가능합니다. 이는 의도치 않게 변수를 수정하거나 다른 변수와 충돌하는 등의 문제를 일으킬 수 있습니다.

싱글톤 패턴을 사용한 예시 (JS)

class Logger {
  static instance = null;

  static getInstance() {
    if (Logger.instance === null) {
      Logger.instance = new Logger();
    }

    return Logger.instance;
  }

  log(message) {
    console.log(message);
  }
}

// 싱글톤 객체를 가져와서 로그 기록
function log(message) {
  const logger = Logger.getInstance();
  logger.log(message);
}

// 다른 파일에서도 싱글톤 객체에 접근 가능
function otherFunction() {
  const logger = Logger.getInstance();
  logger.log('Hello, world!');
}

위 예시에서는 Logger 클래스에 getInstance()메소드를 추가하여 싱글톤 패턴을 구현하였습니다. getInstance()메소드는 Logger클래스의 정적 메소드로써, 싱글톤 객체를 가져오거나 생성하여 반환합니다. 이를 통해, 전역 변수를 사용하지 않으면서도 전역적인 접근이 가능하도록 구현되었습니다.

전역 변수를 사용한 예시 (Java)

// 전역 변수로 선언된 Logger 객체
public class MyApp {
    public static Logger logger = new Logger();
    
    public static void main(String[] args) {
        logger.log("Hello, world!");
    }
}

// 다른 클래스에서도 MyApp.logger에 접근 가능
public class MyOtherClass {
    public void doSomething() {
        MyApp.logger.log("Doing something...");
    }
}

위 예시에서 logger객체는 MyApp클래스의 전역 변수로 선언되어 있으므로, 어디서든지 접근 가능합니다. 이는 의도치 않게 변수를 수정하거나 다른 변수와 충돌하는 등의 문제를 일으킬 수 있습니다.

싱글톤 패턴을 사용한 예시 (Java)

public class Logger {
    private static Logger instance = null;
    
    private Logger() {}
    
    public static Logger getInstance() {
        if (instance == null) {
            instance = new Logger();
        }
        return instance;
    }
    
    public void log(String message) {
        System.out.println(message);
    }
}

// 싱글톤 객체를 가져와서 로그 기록
public class MyApp {
    public static void main(String[] args) {
        Logger logger = Logger.getInstance();
        logger.log("Hello, world!");
    }
}

// 다른 클래스에서도 싱글톤 객체에 접근 가능
public class MyOtherClass {
    public void doSomething() {
        Logger logger = Logger.getInstance();
        logger.log("Doing something...");
    }
}

위 예시에서는 Logger클래스에 getInstance()메소드를 추가하여 싱글톤 패턴을 구현하였습니다. getInstance()메소드는 Logger클래스의 정적 메소드로써, 싱글톤 객체를 가져오거나 생성하여 반환합니다. 이를 통해, 전역 변수를 사용하지 않으면서도 전역적인 접근이 가능하도록 구현되었습니다.

싱글톤 패턴의 장단점은?

장점:

  • 전역에서 접근 가능한 유일한 객체를 보장할 수 있습니다.
  • 메모리 낭비를 줄일 수 있습니다.

단점:

  • 멀티스레드 환경에서 동기화 처리를 하지 않으면 문제가 생길 수 있습니다.

    싱글톤 객체가 여러 개 생성되는 경우 불일치 문제가 발생할 수 있습니다. 이를 해결하기 위해서는 동기화 처리가 필요합니다.

  • 객체 지향 설계 원칙 중 개방-폐쇄 원칙(OCP)을 위반합니다.

    개방-폐쇄 원칙은 소프트웨어 요소(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하지만 변경에는 닫혀 있어야 한다는 원칙입니다. 즉, 기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있어야 한다는 것입니다. 그러나 싱글톤 패턴은 클래스 내부에서 자신의 유일한 인스턴스를 생성하므로, 이를 수정하지 않으면 싱글톤 객체의 유일성이 보장됩니다. 따라서 싱글톤 객체를 수정해야 할 경우, 이러한 변경이 일어날 가능성이 높습니다. 이는 코드의 유연성을 제한하고 유지 보수를 어렵게 만들 수 있습니다.

싱글톤 패턴의 예시는?

  • 로그를 처리하는 클래스
  • 데이터베이스 커넥션 관리 클래스
  • 소켓 통신을 다루는 클래스

싱글톤 패턴은 객체지향 프로그래밍에서 매우 중요한 역할을 합니다. 하지만, 싱글톤 패턴은 다른 디자인 패턴과 함께 사용할 때 더욱 유용하게 사용할 수 있습니다. 예를 들어, 싱글톤 패턴과 팩토리 메소드 패턴을 함께 사용하면, 유일한 객체를 생성하면서도 개방-폐쇄 원칙을 지킬 수 있습니다.

1개의 댓글

comment-user-thumbnail
2023년 3월 2일

디자인패턴 너무 어렵네요 ㅠ

답글 달기