티스토리 뷰

반응형

때로는 새로운 클래스를 명시 적으로 선언하지 않고 클래스를 약간 수정 한 객체를 만들어야 합니다.Java는 익명의 내부 클래스 로이 경우를 처리합니다. Kotlin은 객체 표현과객체 선언 으로이 개념을 약간 일반화합니다.

fun main(args: Array<String>) {
	foo()
}

fun foo() {
	val adHoc = object {
		var x: Int = 10
		var y: Int = 20
	}
	print(adHoc.x + adHoc.y)
}

익명 객체는 로컬 및 개인 선언에서만 유형으로 사용할 수 있습니다. 익명 객체를 공용 함수의 반환 유형 또는 공용 속성의 유형으로 사용하는 경우 해당 함수 또는 속성의 실제 유형은 익명 객체의 선언된 상위 유형이거나 Any상위 유형을 선언하지 않은 경우입니다. 익명 객체에 추가된 멤버는 액세스 할 수 없습니다.

fun main(args: Array<String>) {
	println(foo().x)
	println(publicFoo().x) // 참조 에러 발생
}

private fun foo() = object {
	val x: String = "x"
}

fun publicFoo() = object {
	val x: String = "x"
}

 

코틀린에는 static 키워드가 없습니다. 싱글톤과 정적 멤버는 아래 방법을 이용합니다.

코틀린 싱글톤 (Object 선언)

fun main(args: Array<String>) {
	val singleton = Singleton
	val singleton2 = Singleton // 싱글톤이기에 init은 한번만 호출됩니다.
	singleton.checkSingleton()
}

object Singleton {
	init {  println("init 실행")}
	fun checkSingleton() = println("싱글톤 입니다.")
}
/*
 	실행 결과
	init 실행
	싱글톤 입니다.
 */

 

동반자 객체 (Companion Objects)

  • 자바에서 static 멤버를 코틀린에서 companion object로 사용 가능
  • 자바에서 코틀린 변수나 함수를 호출할 때는 어노테이션(@JvmStatic, @JvmField) 처리가 필요합니다.
fun main(args: Array<String>) {
	Class1.call()
	println(Class1.num)
	
	Class2.Companion.call() // 이름이 없을 경우 Companion을 이용하여 호출
	println(Class2.Companion.num)
}

class Class1 {
	companion object Create {
		val num = 10
		fun call() = println("class1, 호출")
	}
}

class Class2 {
	// 이름 생략 가능
	companion object {
		@JvmField val num = 20
		@JvmStatic fun call() = println("class2, 호출")
	}
}

 

위 코드를 이해하기 위해서는 아래 코틀린 문법이 필수입니다.

2019/05/19 - [Kotlin] - 코틀린 기초 문법) 1. 코틀린 변수 정의하기

2019/05/19 - [Kotlin] - 코틀린 기초 문법) 2. 코틀린 함수 정의하기

2019/05/22 - [Kotlin] - 코틀린 기초 문법) 10. 코틀린 클래스와 생성자, init 키워드 알아보기

반응형
댓글
최근에 올라온 글
최근에 달린 댓글