728x90
오늘 Kotlin 을 사용하다가 objcet 로 만든 곳에서 Class 내부 Property 를 참조해야 하는 일이 생겼다.
코드는 대략적으로 아래와 비슷한 상황이였다.
interface Roach {
fun roa()
}
class Test(
val testProperty: String,
) {
fun test() {
object : Roach {
override fun roa() {
// testProperty 에 접근하고 싶음
}
}
}
}
처음에는 음 this 를 사용하면 붙어질까? 라는 생각을 했지만 당연히도 익명 클래스의 안이기 때문에 오히려 this 에 맵핑되어 있는 객체는 익명 클래스의 인스턴스 라는 것을 깨닫게 됬다. 그래서 어떻게 할까 하다가 아래와 같은 방법이 되는지도 테스트 해봤다.
class Test(
val testProperty: String,
) {
fun test() {
val testProperty = testProperty
object : Roach {
override fun roa() {
// testProperty 에 접근하고 싶음
println(testProperty)
}
}
}
}
이건 아마도 클로져 때문에 되는것 같다는 생각이 들었고, 좋은 방법이 아니라는 생각이 들었다.
단순히 이런 방법도 가능하구나 정도였다.
그 뒤에 예전에 공부했던 레이블 키워드가 떠올랐고, 레이블로 어떻게 정의해볼 수 없을까 하다가 아래와 같은 방법을 깨달았다.
class Test(
val testProperty: String,
) {
fun test() {
object : Roach {
override fun roa() {
// testProperty 에 접근하고 싶음
println(this@Test.testProperty)
}
}
}
}
아무래도 this의 Context 를 @Test 로 지정해서 이 것이 가능하다는 생각이 들었다.
코틀린을 더 많이 공부해야겠단 생각이 들었다.
추가
공부하다 보니 this 키워드는 가장 내부의 클래스의 참조를 가진다고 한다. 그래서 this@Test 를 쓰는 것은 Qualified this 를 이용하는 것이라고 한다!
'Kotlin' 카테고리의 다른 글
GC 분석해보기 (0) | 2022.05.24 |
---|---|
Kotlin Delegation (0) | 2022.05.16 |
고차함수에서 Return 이 안되는 이유 (1) | 2022.05.03 |
Kotlin DSL (0) | 2022.03.28 |
Kotlin 의 확장함수가 좋은 이유 (0) | 2022.03.18 |