package Object  
  
//코틀린에서는 인스턴스가 단 하나뿐인 객체를 만들 수 있다.  
  
//object로 선언한다.  
//오브젝트는 생성자를 가질 수 없다. (괄호를 붙이지 않음)  
//java 싱글톤 생각하면 됨  
//object DoAuth {  
//    fun takeParams(username: String, password: String) {  
//        println("input Auth parameters = $username:$password")  
//    }  
//}  
//fun main() {  
//    // takeParams()가 호출되는 순간 오브젝트가 생성됨  
//    DoAuth.takeParams("coding_ninja", "N1njaC0ding!")  
//    // input Auth parameters = coding_ninja:N1njaC0ding!  
//}  
  
//data object  
//data class와 똑같이 equals(), toString()을 기본으로 제공한다.  
//copy()는 제공하지 않는다. (object는 인스턴스가 하나라 복사할 수 없음)  
//예시코드  
//data object AppConfig {  
//    var appName: String = "My Application"  
//    var version: String = "1.0.0"  
//}  
//  
//fun main() {  
//    println(AppConfig)          // AppConfig  (toString 자동 제공)  
//    println(AppConfig.appName)  // My Application  
//}  
  
//Companion Object  
//class 속에 존재 할 수 있는 object이다.  
//해당 클래스의 모든 인스턴스에서 접근할 수 있음  
//java에서의 static과 같음  
//companion object는 이름을 정하지 않으면 자동으로 Companion 이름을 가지고 생성됨  
class BigBen {  
    companion object Bonger {  
        fun getBongs(nTimes: Int) {  
            repeat(nTimes) { print("BONG ") }  
        }  
    }  
}  
  
//참조할 때는 클래스 이름으로 참조하면 됨  
fun main() {  
    // 클래스가 처음 참조될 때 컴패니언 오브젝트 생성  
    BigBen.getBongs(12)  
    // BONG BONG BONG BONG BONG BONG BONG BONG BONG BONG BONG BONG  
}