★★★싱글턴★★★
: ㄱ. 공통적으로 객체를 하나 공유해서 받아와서 쓸 수 있게 해준다. (공유된 객체일경우 다른쪽에서 썼는데 남아있으면 안될때 사용한다.)
ㄴ. 인스턴스화 안했는데, 변수에 위치값 저장 안했는데 클래스.메소드를 바로 쓸 수 있다.
fun main() {
var singletonObject1 = MySingletonClass.getInstance(trash = 1)
singletonObject1.setNum(5)
println("num값은: ${singletonObject1.getNum()}")
var singletonObject2 = MySingletonClass.getInstance(trash = 1)
singletonObject2.setNum(10)
println("num값은: ${singletonObject1.getNum()}")}
class MySingletonClass private constructor() { //1. 클래스를 만들었는데 외부에서만들수없게 해당 생성자 막음
private var num:Int = 0
companion object { //2. 외부에서 바로 접근할수 있도록 object생성
@Volatile private var instance: MySingletonClass? = null //3. .객체를담기위한변수 null
private var trash = 0 //3. 이미생성된 이 클래스의 객체를 외부에서 가져가기위한 코드
fun getInstance(trash: Int): MySingletonClass {
this.trash = trash
if(instance == null) { // 4. 외부에서 요청왔을때 instance가 null인지 검증
synchronized(this) { //5.내가 getInstance를 호출하는동안에 다른사람이 호출해서 꼬이는걸 막기위해 잠궈둔다.
instance = MySingletonClass()
}
}
return instance!!
}
}
fun setNum(num: Int) {
this.num = num
}
fun getNum(): Int{
return this.num
}
}
>>
1.MySingletonClass 안에는 외부에서 가져갈수 있게
getInstance 메소드를 companion object로 해놨음.
2. 그래서 main에서 trash에 1을 주면서 바로 getInstance를 호출했다.
3. getInstance에 파라미터를 달라고 했으니까 trash에 1을 줬음
4. 그렇게 getInstance를 얻어와서 var singletonObject1에 넣어줬으니까
5. singletonObject1.setNum(5)을 호출한다.
6. setNum 메소드에서 5를 받아서 5를 리턴하고 println("num값은: ${singletonObject1.getNum()}")에서 5를 출력한다.
7. var singletonObject2 에서 getInstance를 가져온다(새로만드는게아니라 이미만들어진객체)
8. 이미 var singletonObject1때 null이 아니어서 만들어 놨기 때문에 if문을 실행하는게아니라
9. 이미만들어진 instance를 바로 return 해준다.
10. 그래서 var singletonObject2에 넘어왔고
11. setNum을할꺼다 10을넣어줘서
12. var singletonObject2에서 setNum에 10을 넣어줬는데도
13. ${singletonobject1.getNum()}에서 10이 출력 된다.
14. 왜냐하면 var singletonObject1이나 2나 각각 MySingletonClass 객체를 만든게 아니라
이미 하나로 만들어진 instance를 가져와서 썼기 떄문에 결국 똑같은 instance를 쓴다.
'Android.Study' 카테고리의 다른 글
<Android> 복수 데이터 리턴& 확장함수 (0) | 2023.07.18 |
---|---|
<Android>자료형의 변환 (0) | 2023.07.18 |
<Android>널 세이프티& 컬렉션 (0) | 2023.07.17 |
<Android>지연 초기화&접근제한자 (0) | 2023.07.17 |
<Android>오버로딩&인터페이스 (0) | 2023.07.17 |