Developing Myself Everyday
article thumbnail

싱글턴 패턴이란?


싱글턴 패턴은 객체지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 애플리케이션에서 특정 클래스의 인스턴스가 단 하나만 생성되도록 보장하는 패턴이다. 즉, 해당 클래스의 인스턴스가 오직 하나뿐이며, 어디서든지 그 인스턴스에 접근하여 사용할 수 있도록 만들어 준다.

 싱글턴 패턴을 사용하는 이유는 다음과 같다.

  1. 자원 공유: 여러 객체에서 하나의 인스턴스를 공유하여 사용할 수 있다. 이를 통해 자원을 효율적으로 사용할 수 있다.
  2. 객체의 생성 비용 최소화: 인스턴스가 한 번 생성된 이후에는 다시 생성하지 않기 때문에, 객체 생성 비용이 큰 경우에 사용하면 효율적이다.
  3. 인스턴스의 수 제한: 클래스의 인스턴스가 하나뿐이기 때문에, 불필요한 인스턴스 생성을 방지할 수 있다.

 싱글톤 패턴을 구현하기 위해서는 일반적으로 해당 클래스의 생성자를 private로 선언하고, 해당 클래스의 인스턴스를 저장할 정적 변수를 선언하여 getInstance() 메소드를 통해 인스턴스에 접근하도록 한다. 이렇게 구현된 싱글톤 클래스는 다른 클래스에서 호출될 때마다 같은 인스턴스를 반환하게 된다.

 

싱글톤 패턴의 단점

객체 지향 설계 원칙 중에 개방-폐쇄 원칙이란 것이 존재한다.

만약 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나, 많은 데이터를 공유시키면 다른 클래스들 간의 결합도가 높아지게 되는데, 이때 개방-폐쇄 원칙이 위배된다.

결합도가 높아지게 되면, 유지보수가 힘들고 테스트도 원활하게 진행할 수 없는 문제점이 발생한다.

 

 또한, 멀티 스레드 환경에서 동기화 처리를 하지 않았을 때, 인스턴스가 2개가 생성되는 문제도 발생할 수 있다.

 

 따라서, 반드시 싱글톤이 필요한 상황이 아니면 지양하는 것이 좋다고 한다. 

 

 

 

싱글톤 패턴 구현 - JAVA


 간단하게 문자열을 출력하는 메소드를 싱글톤 패턴으로 구현해 보겠다.

 

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }

    public void doSomething() {
        System.out.println("Singleton instance is doing something");
    }
}

 

위 코드에서 Singleton 클래스는 private 생성자를 가지고 있으며, 객체 생성은 instance 변수를 통해 한 번만 이루어진다. getInstance() 메소드는 instance 변수를 반환한다. doSomething() 메소드는 Singleton 인스턴스의 동작을 나타내는 예시이다.

 

자바에서는 stactic 키워드를 사용해 instance 변수와 getInstance() 메소드를 선언하였다.

 

 

싱글톤 패턴 구현 - Kotlin


Kotlin에서는 싱글톤 인스턴스를 간편하게 만들기 위해 object를 제공하고 있다. object를 사용하면 쉽게 싱글턴 객체를 만들 수 있다.

 

 

object의 문법은 클래스의 문법과 유사하다. 다만 싱글톤 객체에는 생성자를 포함할 수 없다. 개발자가 인스턴스를 직접 만들 수 없으므로 모든 속성이 중괄호 안에 정의되며 초깃값이 부여된다.

 

object StudentProgress {
    var total: Int = 10
    var answered: Int = 3
}

 

싱글톤 객체의 인스턴스를 직접 만들 수 없으므로 그 속성에 접근하려면 객체 자체의 이름을 점 연산자로 참조하여 속성에 엑세스 할 수 있다.

 

    println("${StudentProgress.answered} of ${StudentProgress.total} answered.")

 

 

 

클래스 내에서 싱글톤 객체를 정의할 수도 있다. companion object를 사용하여 클래스 내에서 속성과 메서드에 엑세스할 수 있으므로 문법이 더 간결해진다. companion object는 자바에서 static 키워드와 유사한 역할을 한다.

 

 

class Singleton private constructor() {
    companion object {
        private val instance = Singleton()

        @JvmStatic
        fun getInstance() = instance
    }

    fun doSomething() {
        println("Singleton instance is doing something")
    }
}

 

위 코드에서 Singleton 클래스는 private 생성자를 가지고 있으며, 객체 생성은 Companion Object 내부의 instance 변수를 통해 한 번만 이루어진다. getInstance() 메소드는 instance 변수를 반환한다. doSomething() 메소드는 Singleton 인스턴스의 동작을 나타내는 예시이다.

 

위 예시에서는 Singleton 클래스의 인스턴스를 저장하기 위한 instance 변수와 getInstance() 메소드를 companion object 내부에 선언했다.

 

 

 

 

 

 

Reference

 

싱글턴 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

제네릭, 객체, 확장  |  Android Developers

Compose 코드에서 사용할 제네릭, enum 클래스, 데이터 클래스, 객체, 범위 함수와 같은 더 많은 Kotlin 개념을 대략적으로 알아봅니다.

developer.android.com

 

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!