들으면서 JAVA의 static이 생각났다.
singleton 패턴의 경우 예전에 글로 읽기만 하고 실제로 구현해 본 적은 없어서 잘 와닿지는 않았지만
JAVA의 static처럼 어디에서든지 접근할 수 있다는 .. 대충 그런 개념인 것 같다.
일단 나는 object는 static class와 비슷하고, companion object는 해당 클래스 내의 static 변수를 모아놓은..? 거라고 이해하였다.
1. object
fun main() {
println(Counter.count)
Counter.countUp()
Counter.countUp()
println(Counter.count)
Counter.clear()
println(Counter.count)
}
object Counter {
var count = 0
fun countUp() {
count++
}
fun clear() {
count = 0
}
}
<실행결과>
0
2
0
object로 Counter를 선언한다. Counter의 경우 countUp이 선언되면 count가 1씩 증가하도록 하였다.
사용할 때는 자바의 static class처럼 Counter.XX()의 방식으로 사용한다.
자바의 static class처럼 남용하면 문제가 생기겠지..?
2. companion object
class FoodPoll(val name:String) {
companion object {
var total = 0
}
var count = 0
fun vote() {
total++
count++
}
}
fun main() {
var a = FoodPoll("cake")
var b = FoodPoll("cookie")
a.vote()
a.vote()
b.vote()
b.vote()
b.vote()
println("RESULT :: ${a.name} (${a.count}) vs ${b.name} (${b.count}) => ${FoodPoll.total}")
}
<실행결과>
RESULT :: cake (2) vs cookie (3) => 5
companion object는 object와 마찬가지로 어디에서나 접근이 가능하나 특정 클래스 내에 속해있다는 것에서 object와 차이점을 보인다. 자바로 생각하자면 static 변수와 비슷하지 않을까?
main()에서 FoodPoll 객체 두 개를 만든다음 vote()를 다섯 번 실행한다.
vote()는 해당 객체의 count와 companion object인 total을 1씩 증가하는 함수이다.
실행 결과를 보면 a와 b객체의 count는 각각 vote를 호출한 횟수이고 total은 그 합과 같다는 것을 알 수 있다.
companion object를 사용할 때 주의할 점이 있는데,
JAVA의 static 변수의 경우 클래스로 생성한 객체에서도 해당 static변수를 참조연산자를 통해 가져올 수 있는 반면
compainion object의 경우 객체의 참조연산자를 통해서 가져오는 경우 컴파일 에러가 발생한다.
예를 들어 FoodPoll의 객체인 icecream이 있다고 할 때
자바는 아래 두 경우 모두 사용할 수 있지만
(물론 뭐라고 메세지를 띄우기는 한다)
int total2 = FoodPoll.total //가능
int total = icecream.total; //가능
코틀린에서는 'Unresolved reference'이라며 에러를 발생시키는 것을 확인할 수 있다.
var t1 = FoodPoll.total //가능
var t2 = a.total //불가능 (Unresolved reference: total)
나중에 기본서를 한번 더 읽으면서 내가 이해한 게 맞는지 꼭 확인해야 할 것 같다.
지금은 그냥.. '앗 이 맛은.... static의 맛과 비슷하구나..!' 하는 느낌이라..
지금 그냥 맛보기만 하는 수준이라서 더 그런 것 같기도 하고..?
'개발 > Kotlin' 카테고리의 다른 글
코틀린 공부 - 함수(2) (0) | 2021.08.02 |
---|---|
코틀린 공부 - 함수(1) (0) | 2021.08.02 |
코틀린 기초 - 4(고차함수, 람다) (0) | 2020.06.24 |
코틀린 기초 - 3 (if~else, when) (0) | 2020.06.23 |
코틀린 기초 - 2 (배열, 반복문) (0) | 2020.06.16 |