혼자 돌아버리는 게 싱글턴 아니었냐고

김태영·2024년 7월 2일
0

TIL

목록 보기
41/70
post-thumbnail

오늘 공부한 것

- 알고리즘 숫자 변환하기 문제 풀이
- 팀 프로젝트 기획 및 작업

개요

저번 과제와 이번 과제의 공통점이 뭔지 아는가. 바로 싱글턴이라는 단어가 계속 나왔다는 것이다! 데이터를 관리할 때 싱글턴을 사용하면 객체를 하나만 만들고도 전역으로 그 객체에 접근할 수 있어 편리하다고 한다. 그래서 오늘은 싱글턴에 대해 알아보았다.

싱글턴이 뭐길래

Singleton Pattern이란 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍쳐 패턴을 말한다. 이 때 인스턴스는 전역에서 사용 가능하다. 코틀린은 Singleton Pattern을 언어 차원에서 지원한다. Object와 Compaion Object가 그 예다.

Object

오브젝트는 생성자 없이 객체를 직접 만들어 낸다.

여러 개의 인스턴스가 필요하지 않고, 하나의 객체만으로 공통적인 속성과 함수를 사용해야 하는 경우 사용한다.

💡 클래스와 다른 점

클래스는 인스턴스 객체를 만들기 위한 ‘틀’이다.
따라서 내부에 있는 속성이나 함수를 사용하려면 ‘생성자’를 통해 실체가 되는 인스턴스 객체를 만들어야 한다.

Companion Object

오브젝트긴 오브젝튼데 클래스 내부에 존재하는 오브젝트를 말한다.

이걸로 어떻게 싱글턴을 구현하라는 것일까?

냅다 클래스의 객체를 와다닥 만들어버리면 그냥 클래스랑 다를 게 없을 것이다. 그래서 클래스의 생성자를 private으로 두어 외부에서 사용할 수 없게 하고, companion object의 객체 생성 함수를 통해 객체를 단 하나만 생성하게끔 하는 방식을 이용한다. 코드로 보면 다음과 같다.

class TaeYoung2da private constructor(context: Context) {
    companion object {
        private var instance: TaeYoung2da? = null

        fun getInstance(context: Context) =
            // instance가 null이면 새로운 객체를 만든다.
            // instance가 null이 아니면 기존 객체(instance)를 반환한다.
            instance ?: TaeYoung2da(context).also {
                instance = it
            }
    }
}

위와 같은 방법은 lazy initialization이라고 하는 것 같다. 이 외에도 eager, thread-safe 등의 방법이 있지만.. 아직은 lazy와 eager 방법만 알고 있어도 될 것 같다. 참고로 eager는 처음에 냅다 클래스 내부에 객체를 생성해놓고 해당 객체를 반환하는 방법이다.

class TaeYoung2da private constructor() {
    companion object {
        private var instance: TaeYoung2da = TaeYoung2da()

        fun getInstance(): TaeYoung2da {
            return instance
        }
    }
}

마치며

아기다리 고기다리던 팀 프로젝트가 시작했다. (안기다리긴 했슴..) 팀에 폐를 끼치지 않게 열심히 해야겠다.

profile
화이팅

0개의 댓글