티스토리 뷰




싱글톤(Singleton) 이란?

싱글톤은 딱 하나의 인스턴스만 생성할 수 있는 클래스다. 때문에 싱글톤은 앱이 메모리에 있는 한 계속 존재한다.

이러한 특징으로 인해 데이터를 싱글톤으로 관리할 경우 앱의 생명주기동안 고유한 데이터 사용을 보장할 수 있다.

하지만 Android OS가 Application을 메모리에서 제거할 때 같이 소멸되기 때문에 장기간 데이터 보존을 위한 솔루션은 아니다.
(장기간 데이터 보존을 위한 솔루션으로는 SQLite, 서버 통신 등이 있다)



싱글톤의 특징

  1. 자기 자신을 저장하기 위한 static object를 갖는다.

  2. private 생성자를 갖는다.

  3. 인스턴스 반환을 위한 get 메서드를 갖는다.

만약 자신의 인스턴스가 있다면 get 메서드를 통해 기존 인스턴스를 반환한고, 반대의 경우에는 생성자를 호출하여 새로운 인스턴스를 반환한다.

private static MySingleTone mSingleTone;

public MySingleTone get(Context context) {
    if(mSingleTone == null) {
        return new MySingleTone(context);
    } else {
        return mSingleTone
    }
}


이러한 특징으로 인해 싱글톤은 메모리에 오직 하나의 인스턴스만 존재하게 된다.


싱글톤 예제

아래와 같이 학생 정보를 저장하는 Model Class인 Student가 있다고 가정하자.

public class Student {
    private UUID mId;
    private String mName;
    private String mGender;

    public Student(String name, String gender) {
        mName = name;
        mGender = gender;
    }

    public UUID getmId() {
        return mId;
    }

    public void setmId(UUID mId) {
        this.mId = mId;
    }

    public String getmName() {
        return mName;
    }

    public void setmName(String mName) {
        this.mName = mName;
    }

    public String getmGender() {
        return mGender;
    }

    public void setmGender(String mGender) {
        this.mGender = mGender;
    }
}

이러한 데이터는 싱글톤을 통해 관리될 수 있다.

public class StudentLab {
    private static StudentLab sStudentLab;
    private List<Student> mStudents;

    public static StudentLab get(Context context) {
        if (sStudentLab == null) {
            return new StudentLab(context);
        } else {
            return sStudentLab;
        }
    }

    private StudentLab(Context context) {
        mStudents = new ArrayList<>();
    }

    public List<Student> getStudents() {
        return mStudents;
    }
}

위와같이 싱글톤을 통한 데이터 관리는 불필요한 메모리 낭비를 피할 뿐만 아니라 액티비티 생명주기 안에서 고유한 데이터 사용을 보장한다.

또한 싱글톤은 ListView 데이터를 관리할 때 유용하다.

댓글