개요

나는 학부때나 대학원때나 주로 커널 코드를 살펴볼 일이 잦았어서 C언어와 같은 절차지향언어를 대부분 사용했었다. 그래서 싱글톤 패턴이라는 개념을 잘 몰랐던 나는 이것이 무엇일까? 라는 궁금증은 있었지만, 크게 찾아보진 않았었다.

정보처리기사 시험을 볼 때 외우긴 했지만 어떻게 사용하는진 모르는 상태..


그런데, 이번에 회사에서 Rust 코드 리뷰를 받으면서 해당 구조는 싱글톤 패턴으로 가져가는 것이 좋을 것 같다는 제안을 받았었다.

그래서, 이번 기회에 싱글톤이 무엇인지 개념을 익히게 되었고 또, Rust에서 어떻게 싱글톤 패턴의 코드를 짤 수 있는지 알게되었다.

 

싱글톤 패턴(Singleton-Pattern)이란?

싱글톤 패턴은 전역 변수를 생각하면 이해하기 쉬울 것 같다.
왜냐하면, 싱글톤 패턴은 전역에서 접근가능한 단 하나의 객체 인스턴스로 구현되기 때문이다.

단 하나의 인스턴스를 사용한다는 의미에서 싱글톤이라는 이름이 붙었나? 싶다.


위키에서 참조한 내용

  • 소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다.


즉, 싱글톤 패턴이란 프로그램이 구동된 후 어떠한 시점에서도 클래스의 인스턴스는 딱 하나만 존재하도록 보장하는 것이다. 그리고, 싱글톤 패턴으로 작성된 클래스는 전역변수로 존재하기 때문에 프로그램의 어느 곳에서나 접근할 수 있는 편리함이 존재한다. 

하지만, 싱글톤 패턴은 전역으로 생성된 단 하나의 인스턴스를 프로그램의 아무데서나 마음대로 접근하라고 만든 객체가 아니며 프로그램의 어떠한 시점에도 인스턴스가 단 하나만 존재하도록 보장하는 것이다.

이를 잘 생각하고 싱글톤 패턴의 클래스를 작성해야 한다.

 

Rust에서 싱글톤

Rust에서 싱글톤은 Global Mutable Object로 작성될 수 있다.

다시 말해, 수정가능한 글로벌 전역 객체로 작성될 수 있다.

Rust에서 이것은 static mut 으로 선언할 수 있으며, unsafe 블록을 사용해 싱글톤 객체에 연산을 수행할 수 있다.

unsafe 블록 관련 글 : https://rinthel.github.io/rust-lang-book-ko/ch19-01-unsafe-rust.html

 

Rust에서 싱글톤을 static 으로만 선언하여 사용한다면 Mutex를 이용해 unsafe 블록을 피할 수 있을 것이다.

관련 링크 : https://refactoring.guru/ko/design-patterns/singleton/rust/example

 

하지만, static으로 싱글톤 객체를 선언한다면 컴파일 단계에서 메모리 크기가 정해져야 함으로 명시적으로 객체의 초기화를 수행해주어야 한다. 그러나, 싱글톤 객체는 런타임 단계에서 초기화 해주어야 하는 경우가 존재하게 된다.

 

예를 들어, 싱글톤 객체의 필드 값이 컴파일 단계에서 결정되는 것이 아니라 프로그램의 시작 후인 런타임 단계에서 정해져야 할 때가 있을 것이다. 그러면, 해당 싱글톤 객체는 static mut 키워드를 사용해 수정 가능하도록 선언해주어야 한다.

 

아래는 그 예시로 작성한 싱글톤 패턴 코드이다.

#[derive(Debug)]
struct Singleton {
    var: u32,
}

static mut GLOBAL_SINGLETON: Option<Singleton> = None;

fn main() {
    unsafe {
        println!("{:?}", GLOBAL_SINGLETON);

        GLOBAL_SINGLETON = Some(Singleton{var: 9999});

        println!("{:?}", GLOBAL_SINGLETON);
    }
}

 

위 코드에서는 Option을 사용해 수정 가능한 싱글톤 객체를 선언해주었다.

 

또한, 컴파일 단계에서 싱글톤 객체를 None으로 할당될 수 있도록 하였다.

그리고, main() 함수에서 Some을 통해 특정 값으로 할당시키는 모습을 확인할 수 있다.

 

이것은 다시 말해, 런타임 단계에서 싱글톤 객체를 초기화해주는 것이라 할 수 있다.

 

References

https://rinthel.github.io/rust-lang-book-ko/ch19-01-unsafe-rust.html

https://refactoring.guru/ko/design-patterns/singleton/rust/example
https://ko.wikipedia.org/wiki/%EC%8B%B1%EA%B8%80%ED%84%B4_%ED%8C%A8%ED%84%B4
https://bibi6666667.tistory.com/511

'Programming > Rust' 카테고리의 다른 글

[Rust] 소유권 시스템  (0) 2023.09.24
[Rust] 함수 선언, 파라미터, 리턴  (0) 2023.08.28
[Rust] 변수의 타입  (0) 2023.08.24
[Rust] 기초 학습 사이트  (0) 2023.07.15
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기