요즘 백 투 베이직(Back To Basic)을 생각하며 제일 기본적인 것부터 시간 날 때마다 하나하나 정리하고 있다.
제일 처음이 싱글톤 패턴이다. 프론트엔드 개발자의 시점으로 해석함에 유의하자.
언어는 자바(Java), 코틀린(Kotlin), 스위프트(Swift)가 기준이다.
프로그램의 기본적인 구조는 다음과 같다. 여러개의 뷰 스택이 있고, 그 속에는 데이터가 쌓여있다.
이걸 아마 코드로 표현하면 이렇게 될 것이다.
(getter/setter이 있다고 가정하자)
class UserInfo {
var name : String = "김마리"
var age : Int = 18
}
class View1 {
var userInfo = UserInfo()
var name = userInfo.getName()
var age = userInfo.getAge()
}
class View2 {
var userInfo = UserInfo()
var name = userInfo.getName()
var age = userInfo.getAge()
}
class View3 {
var userInfo = UserInfo()
var name = userInfo.getName()
var age = userInfo.getAge()
}
그런데 만약 특정 뷰에서 데이터가 바뀐다? 그럼 어떻게 될까?
그런데, 나머지 뷰는 데이터가 바뀐걸 인지할 수 있을까?
코드를 보면 뷰 개개인에 대한 userInfo 인스턴스가 따로따로 만들어져서 각각 참조하고 있기 때문에 바뀌는 것이 보여도 변경된 값을 참조할 수 없다. 그렇다고 다시 바뀔 때마다 새 인스턴스를 호출할 수도 없고(..)
그런데 이런 방식이면 어떨까?
만약 하나의 데이터 인스턴스만 있고, 뷰에서 간접적으로 접근한다면 어떨까? 다음과 같은 데이터 다이어그램이 만들어질 것이다.
만약 뷰2에서 데이터 변경을 시도해보자.
그런데 뷰1이랑 뷰3도 같은 인스턴스를 참조하기 때문에 결국은 같은 데이터를 가지게 된다.
그럼 어떻게 하나의 데이터 인스턴스를 참조할 수 있을까?
앱이 빌드될 때 static 필드에 먼저 인스턴스를 생성해두고, 그 인스턴스를 호출하도록 한다.
- JAVA
public class UserInfo {
private static UserInfo instance = new UserInfo();
private UserInfo() {}
public static UserInfo getInstance() {
return instance;
}
private String name = "김마리"
private int age = 18
}
자바의 경우 생성자로 호출할 수 없도록 private로 생성자 호출을 미리 막아둔다. 그리고, getInstance를 통해 간접적으로 인스턴스를 참조하도록 한다.
- Kotlin
object UserInfo {
var name : String = "김마리"
var age : Int = 18
}
코틀린의 경우 object를 통해 자동적으로 singleton이 만들어진다.
- Swift
class UserInfo {
static let instance = UserInfo();
private init() {}
}
let을 통해 instance를 불변값으로 만들고, init에 private 를 걸어 초기화를 차단한다.
'컴퓨터 기초' 카테고리의 다른 글
탐욕 알고리즘(Greedy Algorithm) (0) | 2023.02.02 |
---|---|
의사코드(pseudocode) (0) | 2022.12.12 |
응용프로그램 설치하기(2) (0) | 2020.03.18 |
Git 체험하기 (0) | 2020.03.16 |
응용프로그램 설치하기(1). (0) | 2020.03.16 |