오늘 공부할것은 Object와 Companion Object의 차이입니다.
data class Ticket(
val fee: Long
){
companion object {
val text: String = "test"
fun compTest() {
}
}
}
우리가 일반적으로 Companion Object의 코드입니다.
Companion Object를 자바로 바꿔보겠습니다.
Companion Object를 선언하게 되면, class안에서 static
객체가 하나 더 생성되게 됩니다.
그래서 Companion Object를 동반객체라고 표현합니다.
추가로 Companion에 선언된 변수는 Companion 이 아닌 기존 클래스에 static하게 선언되며, Compainon의 getter
를 통해 호출됩니다.
동반 객체인 이녀석은 동반하고있는 클래스가 로드될때 초기화 됩니다.
class Hey{
companion object{
init{
println("언제 초기화 될까나?")
}
}
}
main(){
println("테스뚜 시작!")
Hey()
println("테스뚜 끝!")
}
테스뚜 시작!
언제 초기화 될까나?
테스뚜 끝!
object ObjectTest {
val text: String = "test"
fun compTest() {
}
}
저희가 아는 object입니다.
내부코드를 확인해봅시다!
일단 동반객체인 Companion Object와 다르게, object는 클래스가 하나로 이루어져 있습니다.
또한 static{}
블록이 있는것을 확인하실 수 있고, 이 아래에서 싱글톤처럼 작동한다는것을 볼수있습니다.
그렇다면 static 블록이 언제 실행될지 알아야겠죠?
일반적인 초기화 블록이 인스턴스가 실행될 때마다 실행되는 것과 달리 static block 내부의 코드는 다음의 경우에 딱 한 번만 실행됩니다.
둘의 로드시점은 서로 다릅니다.
obeject
는 static 블록이 감싸짐으로써, 객체가 처음 호출되었을때 초기화 됩니다.
반면에 Compainon Object
는 동반 클래스가 처음 로딩되는 시점입니다.
하지만 사실 아 다르고 어 다른느낌이라 companion(동반)의 느낌을 강하게 들고 가시면 될것 같습니다.
실제로 object는 싱글톤 변수를 만들때 주로 이용하며, Companion Obejct는 컴파일 상수를 정리할때 자주 사용됩니다.
또한 다른 사용방법에 대해서는 아래의 링크를 참고하시면 도움이 될것 같습니다.
https://stackoverflow.com/questions/38381748/why-do-we-use-companion-object-as-a-kind-of-replacement-for-java-static-fields