코틀린 by 키워드 알아보기
What is the `by` keyword in Kotlin?
by 키워드는 내가 코틀린에 입문한 5년 전부터 지금까지 늘 헷갈리던 존재였다. 그런데 오늘 드디어 이해가 돼서! by 에 대해 정리한다. by 를 설명하기 전에 delegate pattern에 대해 먼저 알아야 한다. 간단하게 말하면 내가 할 일을 다른 객체에게 위임하는 패턴이다. 이해가 되도록 코드를 보자.
Speaker 라는 인터페이스가 있고, 이를 DroidKnights와 Sungbin 클래스에서 구현하고 있다. 근데 Sungbin 클래스를 보면 직접 구현하는게 아닌, Speaker 구현체를 인자로 받고 이를 통해 구현을 해주고 있다. 이렇게 내가 바로 하는게 아닌 다른 객체에게 내가 할 일을 위임하는 것이 delegate pattern 이고, 이 예제와 같은 delegate 를 class delegate 라고 한다.
하지만 이런 방식의 delegate 는 많은 코드의 보일러플레이트를 유발한다. 따라서 이를 language level 에서 지원하는것이 바로 by 키워드다. 위 코드를 아래와 같이 by 를 사용해 단 한 줄로 바꿀 수 있다. (by 는 provided by 라고 해석할 수도 있다)
출력 결과는 아래와 같다.
by 는 class delegate 외에 property delegate 도 지원한다. 아래 코드를 보자.
CustomString 클래스에서 getValue 와 setValue 를 operator fun 으로 정의 해주고 있고, 이 함수들이 delegate 로 작동된다. 각각 함수들에 인자들이 존재한다.
- thisRef: 호출된 인스턴스 (this)
- properfy: 호출된 프로퍼티
- value: 사용된 값
A.B = "C"
라는 delegate 가 있을 때 A
부분이 thisRef, B
부분이 properfy, "C"
부분이 value 로 들어가게 된다.
이를 사용한 우리에게 익숙한 예시로는 by lazy 가 있다. 번외로 map 에도 존재한다. 아래와 같이 사용할 수 있고, 역시 operator fun setValue/getValue 로 구현돼 있다.
끝!
다음 글은 아마 코틀린 제네릭 in, out, where 에 대해 쓸 거 같다.
모바일(Android/iOS) 개발자 분들을 위한 카카오톡 오픈 채팅방을 운영하고 있습니다.