Kotlin

Kotlin Class 내부 object 에서 Class Property 참조하는 법

dev_roach 2022. 5. 11. 23:59
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 를 이용하는 것이라고 한다!

728x90

'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