코틀린 class내에 존재하는 companion은 자바로 본다면 static(정적) 영역이다.
클래스 내에 companion object를 정적인 공간을 정의하겠다는것이고
이 공간만을 특별히 관리하는것도 가능함을 뜻한다.
정의된 클래스는 아무런 클래스 관계를 갖지 않지만 companion 영역만 상속받을수 있다.
다음과 같이 예시를 봐보자
abstract class School{
abstract fun working()
fun leaving(): Unit = println("leaving")
}
class MiddleSchool {
companion object: School() {
override fun working() {
println("middle scool working")
}
}
}
// RUN
MiddleSchool.working()
MiddleSchool.leaving()
MiddleSchool 클래스는 개념적으로 School의 하위에 속하는 개념이지만..
반드시 필수로 클래스 전체가 상속을 받지 않고 정적(static)영역만 상속 받는것이 가능하다.
companion static area에 속한 부분만 상속 받은 효과를 받고있게된다.
현재 예제는 일반 메소드이지만 팩토리 메소드를 정의하여 사용하는 사례는 많다고 한다.
그리고 companion 정적 영역도 마음껏 확장함수를 생성할수 있고 다음과 같다.
interface Stone {
companion object {}
}
fun Stone.Companion.coPrint(digit: Int){
println("co $digit")
}
// run
Stone.coPrint(10)