[Kotlin] 15. 오브젝트
Object
기존에 배웠던 클래스는 단지 인스턴스 객체를 만들기 위한 '틀' 이기 때문에 내부에 있는 속성이나 함수를 사용하려면
생성자를 통해 실체가 되는 인스턴스 객체를 만들어야만 했다. (ex : var a = Person("김종국", 1990) )
그러나 여러개의 인스턴스 객체가 필요하지 않으며 단하나의 객체만으로 공통적은 속성과 함수를 사용해야 하는 코드에서는
굳이 class를 쓸필요 없이 object를 사용하면 된다. 코틀린에서는 singleton pattern 을 언어 차원에서 지원한다.
Singleton Pattern : 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍쳐 패턴
아래의 소스코드를 보자.
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는 인스턴스를 생성하지 않고 그 자체로 객체이기 떄문에 생성자를 사용하지 않는다.
object는별도의 인스턴스를 생성하지 않기 때문에 object 이름에 직접 참조연산자를 붙여 사용한다.
(ex : Counter.count, Counter.countup)
object로 선언된 객체는 '최초 사용시' 자동으로 생성이 되며, 이후에는 코드 전체에서 '공용으로 사용' 될 수 있으므로
프로그램이 종료되기 전까지 공통적으로 사용할 내용들을 묶어 만드는것이 좋다.
Companion Object
그런데 기존 클래스 안에도 오브젝트를 만들 수 있다.
companion object 를 만들게되면 클래스의 인스턴스 기능은 그대로 사용하면서 , 인스턴스간의 공용속성 및 함수를 별도로 만들수 있다.
기능적으로는 기존의 언어들이 가진 static 멤버와 비슷하다고 생각할 수 있다.
(Static 멤버 : 클래스 내부에서 별도의 영역에 고정적으로 존재하여 인스턴스를 생성하지 않아도 공용으로 사용가능한 속성이나 함수)
짜장과 짬뽕중 어느 것이 좋은지를 선택하는 설문조사를 하는 코드를 만들어 보자.
각각의 음식을 투표할때마다 개별적인 투표수와 총투표수가 동시에 집계되도록 한다.
fun main(){
var a= FoodVote("짜장")
var b= FoodVote("짬뽕")
a.vote()
a.vote()
a.vote()
b.vote()
b.vote()
println("${a.name} : ${a.count}")
println("${b.name} : ${b.count}")
println("총계 : ${FoodVote.total}")
}
class FoodVote ( val name: String){
companion object{
var total = 0
}
var count = 0
fun vote(){
count ++
total ++
}
}
짜장 : 3
짬뽕 : 2
총계 : 5
a와 b는 서로 다른 인스턴스임에도 companion object 내에 있는 total 을 공유하고 있기 때문에,
모든 인스턴스에서 투표수를 누적할수 있다.