기록
[코틀린/Kotlin] Object, Companion Object 본문
1. Object
기존에 배웠던 클래스는 단지 인스턴스 객체를 만들기 위한 '틀'이기 때문에, 내부에 있는 속성이나 함수를 사용하려면 실체가 되는 인스턴스 객체를 만들어야 했다.
var a = Person("박보영", 1990)
여러개의 인스턴스가 필요하지 않고 단 하나의 객체만으로 공통적인 속성과 함수를 사용해야 하는 코드에서는 굳이 Class를 쓸 필요없이 object를 사용하면 된다.
object는 생성자 없이 객체를 만들어내며, Singleton Pattern을 언어차원에서 지원하는 것이다.
(Singleton Pattern : 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍처 패턴)
object는 인스턴스를 생성하지 않고 그 자체로 객체이기 때문에 생성자는 사용하지 않는다.
별도의 인스턴스를 생성하지 않기 때문에 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
}
}
obejct로 선언된 객체는 '최초 사용시' 자동으로 생성되며 이후에는 코드 전체에서 '공용으로 사용'될 수 있으므로 프로그램이 종료되기 전까지 공통적으로 사용할 내용들을 묶어 만드는 것이 좋다.
2. Companion object
클래스의 인스턴스 기능은 그대로 사용하면서 인스턴스간에 공용으로 사용할 속성 및 함수를 별도로 만드는 기능이다.
이를 이용하면 기존 클래스 안에도 object를 만들 수 있다.
기능적으로는 기존의 언어들이 가진 Static 멤버와 비슷하다.
(Static 멤버 : 클래스 내부에서 별도의 영역에 고정적으로 존재하여 인스턴스를 생성하지 않아도 공용으로 사용가능한 속성이나 함수)
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("총계 : ${}")
}
class FoodPoll (val name: String) {
companion object {
var total = 0
}
var count = 0
fun vote() {
total++
count++
}
}
서로 다른 인스턴스임에도 companion object 내에 있는 total을 공유하고 있기 때문에 모든 인스턴스에서 투표수를 누적할 수 있다.
https://www.youtube.com/watch?v=q7GV68jKLVM&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=16
위 강의를 보면서 개인적으로 공부한 내용을 정리하였습니다.
'[Study] > Kotlin' 카테고리의 다른 글
[코틀린/Kotlin] 캐스팅을 줄여주는 제너릭 (0) | 2022.05.09 |
---|---|
[코틀린/Kotlin] 클래스의 다형성 (as, is) (0) | 2022.05.09 |
[코틀린/Kotlin] 람다함수의 특별한 케이스(it), 스코프 함수(apply, run, with, also, let) (0) | 2022.05.07 |
[코틀린/Kotlin] 고차함수와 람다함수 (0) | 2022.05.07 |
[코틀린/Kotlin] 접근범위와 접근제한자 (0) | 2022.05.06 |