코틀린(Kotlin)

코틀린(kotlin) : 객체 표현식과 객체 선언 Object Expression and Declaration

알통몬_ 2018. 2. 5. 15:04
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 객체의 표현식과 선언에 대해 공부합니다.

우리는 때때로 새로운 클래스를 명시적으로 선언하지 않고, 클래스를 약간 수정한

객체를 만들어야 합니다.

자바에서는 이런 경우 익명 구현 객체로 처리합니다.

코틀린에서는 객체 표현식과 객체 선언으로 개념을 약간 일반화합니다.


Object Expression

어떠한 타입으로부터 상속받은 익명 클래스의 객체를 생성할 때 아래와 같이 선언합니다.

window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}

override fun mouseEntered(e: MouseEvent) {
// ...
}
})

만약 supertype에 생성자가 있다면, 적절한 생성자 매개 변수를 전달해야 합니다.

그리고  만약 단지 수퍼 타입 없이 객체만 필요로 한다면, 아래처럼 사용 가능합니다.

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

fun yo() {
val aaa = object {
var a : Int = 10
var b : Int = 20
}
print(aaa.a + aaa.b)
}


유의할 점은 익명 객체는 로 및 private 선언으로만 사용할 수 있습니다.

그렇지 않으면 위처럼 에러가 발생합니다.

익명 객체 안의 멤버에 접근할 수 없습니다.

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

fun yoo() {
print(ccc.a + ccc.b)
}

private var ccc = object {
var a = 10
var b = 10

}


자바와 마찬가지로 객체 표현식을 둘러싼 {} 안의 멤버에는 접근가능합니다.

자바와는 다르게 final에 국한되지 않습니다.

fun qo() {
val a = 10
val b = 10
var ccc = object {
val c = a + b
}
}



Object declaration

싱글톤 패턴은 유용한 패턴인데요, 코틀린에서는 싱글톤을 쉽게 선언할 수 있습니다.

object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ...
}

val allDataProviders: Collection<DataProvider>
get() = // ...
}

위 같은 코드를 객체 선언 이라고 부릅니다. 그리고 항상 이름 앞에 object 라는 키워드가

와야 합니다. 변수 선언과 마찬가지로 객체 선언은 표현식이 아닙니다.

그리고 대입 문의 오른 쪽에 올 수 없습니다.


객체를 사용할 때는 이름 그대로 사용하면 됩니다.

ex) DataProviderManager.registerDataProvicder(...)

이런 객체는 super type을 가질 수도 있습니다.

object DefaultListener : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}

override fun mouseEntered(e: MouseEvent) {
// ...
}
}


객체 선언은 로컬일 수 없습니다.

아래처름은 사용하면 안되고, fun go() = object {...} 처럼은 사용 가능합니다.

그리고 다른 객체 선언이나, non-inner class 에는 중첩될 수 있습니다.

fun qo() {

object names {

}
}

fun go() = object {

}



Companion Objects

클래스 내부에 선언된 객체 선언은 companion 키워드가 붙을 수 있습니다.

fun main(args: Array<String>) {
var aaa = AAA.Companion
}
class AAA {
companion object {

}
}

Companion 객체의 멤버가 다른 프로그래밍 언어의 정적 멤버처럼 보일 수도 있지만,

런타임에서 실제 객체의 인스턴스이고 인터페이스를 구현할 수도 있습니다.

interface BBB<T> {
fun create() : T
}

class AAA {
companion object : BBB<AAA> {
override fun create(): AAA {
return AAA()
}
}
}


하지만, JVM위에서 @JvmStatic 어노테이션을 사용한다면, Companion 객체의 멤버를

실제 정적 멈버나 필드로 생성할 수 있습니다.


이상입니다.

감사합니다.

반응형