기존에 배웠던 class는 단지 인스턴스 객체를 만들기 위한 '틀'이기 때문에 내부에 있는 속성이나 함수를 사용하려면 생성자를 통해 실체가 되는 인스턴스 객체를 만들어야 했다. 여러개의 인스턴스 객체가 필요하지 않고, 단 하나의 객체만으로 공통적인 속성과 함수를 사용해야하는 코드에서는 굳이 class를 쓸 필요없이 오브젝트(object)를 사용하면 된다.
클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍쳐 패턴
오브젝트로 선언된 객체는 최초 사용시 자동으로 생성되며 이후에는 코드 전체에서 공용으로 사용될 수 있으므로 프로그램 종료 전까지 내용을 묶어 만드는 것이 좋다.
기존 클래스 안에서 인스턴스 기능을 사용할 수 있다.
클래스의 인스턴스 기능은 그대로 사용하면서 인스턴스 간의 공용으로 사용할 속성과 함수를 별도로 만드는 기능
fun main() {
var a = FoodPoll("짜장")
var b = FoodPoll("짬뽕")
a.vote()
a.vote()
b.vote()
b.vote()
b.vote()
println("${a.name} : ${a.count}")
println("${b.name} : ${b.count}")
println("총계 : ${FoodPoll.total}")
}
object FoodPoll (val name: String) {
companion object {
var total = 0
}
var count = 0
fun vote() {
total++
count++
}
}
짜장: 2
짬뽕: 3
총계: 5
서로 다른 인스턴스 임에도 Companion Object 내에 있는 total을 공유하고 있기 때문에 모든 인스턴스에서 투표수를 누적할 수 있다.