[Design Pattern] Singletone, 싱글톤

이은수, Lee EunSoo·2024년 9월 27일
0

DesignPattern

목록 보기
4/12
post-thumbnail

개요

singletone패턴은 어떤 클래스의 객체가 오직 하나만 필요하고, 그 유일한 객체를 시스템의 어디서든지 접근할 수 있도록 설정하는 형태를 말한다.

싱글톤의 형태는 객체를 클래스에 private static으로 생성하고 사용할 클래스의 생성자를 private으로 생성해서 외부에서 객체를 생성하지 못하게 한다. 객체를 사용하기 위해선 객체를 반환하는 메소드를 별도로 만들어서 사용한다.

설명

Q. 객체를 제한하는 이유?

  1. 메모리 절약을 위해서
  2. 프로그램 사양상 하나의 객체만으로 충분한데 여러개의 객체를 생성해서 서로 영향을 미칠 가능성이 존재하는 경우

Q. 객체의 생성시점은 언제일까?

A. 프로그램이 실행되고 getInstance()가 처음으로 실행되는 시점에 객체가 생성된다.

다이어그램

클래스 다이어그램은 단순하다.

클래스 내부에서 자신의 인스턴스를 생성해 놓기에 자기자신을 향하는 화살표형태가 인상적이다.

getInstance()메소드를 통해서 해당 클래스의 접근이 가능하게 설정한다.

java코드

// Java 싱글톤 패턴 예시
public class Singleton {
    
    // Singleton 클래스의 유일한 인스턴스
    private static Singleton instance;
    
    // private 생성자로 외부에서의 인스턴스 생성 차단
    private Singleton() {
        // 생성자 코드 (필요하면 초기화 코드 포함)
    }
    
    // 인스턴스를 제공하는 메서드 (필요할 때만 인스턴스를 생성하는 Lazy Initialization 방식)
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
    
    // 싱글톤 클래스의 기능 메서드
    public void doSomething() {
        System.out.println("Singleton instance is doing something");
    }
}

// 사용 예시
public class Main {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        
        // 같은 인스턴스를 참조하고 있음을 확인
        System.out.println(singleton1 == singleton2);  
        // 출력: true
    }
}

in Swift

// Swift 싱글톤 패턴 예시
class Singleton {
    
    // Singleton 클래스의 유일한 인스턴스
    static let shared = Singleton()
    
    // private 생성자로 외부에서 인스턴스 생성 차단
    private init() {
        // 생성자 코드 (필요하면 초기화 코드 포함)
    }
    
    // 싱글톤 클래스의 기능 메서드
    func doSomething() {
        print("Singleton instance is doing something")
    }
}

// 사용 예시
let singleton1 = Singleton.shared
let singleton2 = Singleton.shared

// 같은 인스턴스를 참조하고 있음을 확인
print(singleton1 === singleton2)  // 출력: true

// 싱글톤 인스턴스의 메서드 호출
singleton1.doSomething()

class Singleton {
    
    // 유일한 인스턴스를 저장할 정적 변수
    private static var instance: Singleton?
    
    // private 생성자로 외부에서 인스턴스 생성 차단
    private init() {
        // 초기화 코드 (필요한 초기화 작업을 여기에 작성)
    }
    
    // 인스턴스를 제공하는 메서드 (필요할 때만 인스턴스를 생성하는 방식)
    static func getInstance() -> Singleton {
        // 인스턴스가 없다면 새로 생성
        if instance == nil {
            instance = Singleton()
        }
        return instance!
    }
    
    // 싱글톤 클래스의 기능 메서드
    func doSomething() {
        print("Singleton instance is doing something")
    }
}

// 사용 예시
let singleton1 = Singleton.getInstance()
let singleton2 = Singleton.getInstance()

// 같은 인스턴스를 참조하고 있음을 확인
print(singleton1 === singleton2)  // 출력: true

// 싱글톤 인스턴스의 메서드 호출
singleton1.doSomething()

싱글톤의 핵심은 클래스의 인스턴스를 하나만 생성해서 사용하는것이므로 1개 이상의 인스턴스를 생성하지 못하게만 하면 된다.(생성자를 이용 못하게)

굳이 getInstance()형태의 함수를 고집할 필요는 없다.

첫번째 예시처럼 자신의 인스턴스 타입프로퍼티만 접근가능하게 해도 되고 두번째처럼 인스턴스 반환 메소드를 만들어도 되고 계산프로퍼티를 사용하는 방법을 이용해도 된다.

중요한것은 인스턴스를 하나만 사용가능하게만 만들면 된다는 것이다.

정리

프로그램의 메모리 낭비를 줄이고 인스턴스의 혼돈을 막기위해서 싱글톤패턴 이라는것이 있다.

하나의 클래스에 한개의 인스턴스(객체)만을 만드는것을 허용하는 형태이다.

profile
iOS 개발자 취준생, 천 리 길도 한 걸음부터

0개의 댓글