본문 바로가기

Android

싱글톤 패턴

싱글톤 패턴?

 - 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴을 말한다.

 

 - 생성자가 여러번 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다.

 

- 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있게 한다.

 

 

싱글톤 예제 ( JAVA )

public class SingleObj {
    private static SingleObj singleObj = null;

    // 외부에서 직접 생성하지 못하도록 private 선언
    private SingleObj(){ }

    // 오직 1개의 객체만 생성
    public static SingleObj getInstance(){
        if( singleObj == null ){
            singleObj = new SingleObj();
        }

        return singleObj;
    }
}

외부에서 객체를 생성할 수 없도록 생성자를 private로 선언한다.

그러면 외부에서 SingleObj 객체를 생성할 수 없으므로, 미리 생성된 자신을 반환할 수 있도록 getInstance()메서드를 정의한다.

 

 

코틀린에서는 싱글톤을 구현할 때 class대신 object를 사용한다.

 

// UserRepo 클래스 싱글톤 구현
object UserRepo {
    val allUser = arrayListOf<User>()
    
    fun getUser() {
    	// ...
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
// 사용방법
UserRepo.getUser()
UserRepo.allUser.add(User("홍길동",Job("IT",Address("Seoul"))))

 

코틀린에서 최상위 함수와 객체 선언을 사용할 때 Companion object를 사용한다.

class A private constructor(val name: String) { // 클래스 A의 주 생성자는 private로 접근 제한

    companion object {
        fun bar() : A {
            return A("zero")	// companion object의 bar() 메서드를 통해 private 생성자 접근 가능
        }
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
// 사용 방법

var a = A("TEST")	// ERROR, 주 생성자는 private 접근제한자로 설정되어 호출 불가능

var b = A.bar()		// SUCCESS, 동반객체의 bar() 메서드를 통해 private 주생성자에 접근이 가능

 

[companion object 이름 사용한 경우]

class A private constructor(val name: String) { // 클래스 A의 주 생성자는 private로 접근 제한

    companion object B {
        fun bar() : A {
            return A("zero")	// companion object의 bar() 메서드를 통해 private 생성자 접근 가능
        }
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
// 사용 방법

A.bar()		// 동반객체 이름 생략
A.B.bar()	// 동반객체 이름 사용
B.bar()		// 클래스명 생략, 동반객체 이름만 사용

 

'Android' 카테고리의 다른 글

Kotlin - lateinit,lazy  (0) 2021.07.07
FloatingActionButton 구현  (0) 2021.03.13
당겨서 새로고침 기능 추가하기  (0) 2021.01.23
Activity 생명주기  (0) 2021.01.21
안드로이드 4대 컴포넌트  (0) 2021.01.20