-
5-4. 고급 함수와 함수형 프로그래밍 활용하기 : 동반 확장Study(종료)/Kotlin 22.09.13 ~ 12.18 2022. 10. 9. 00:05
5장
5-1. 고급 함수와 함수형 프로그래밍 활용하기 : 코틀린을 활용한 함수형 프로그래밍5-2. 고급 함수와 함수형 프로그래밍 활용하기 : 확장5-3. 고급 함수와 함수형 프로그래밍 활용하기 : 확장 프로퍼티5-4. 고급 함수와 함수형 프로그래밍 활용하기 : 동반 확장
5-5. 고급 함수와 함수형 프로그래밍 활용하기: 수신 객체가 있는 호출 가능 참조
5-4. 동반 확장
4장에서 동반 객체를 설명했다. 동반 객체는 어떤 클래스에 내포된 객체 중에서 바깥 클래스의 이름을 통해
객체 멤버에 접근할 수 있는 특별한 객체이다. 확장에서도 이러한 기능을 사용할 수 있다.
fun IntRange.Companion.singletonRange(n: Int) = n..n fun main() { println(IntRange.singletonRange(5)) // 5..5 println(IntRange.Companion.singletonRange(20)) // 20..20 }
동반 객체가 존재하는 경우에만 동반 객체에 대한 확장을 정의할 수 있다.
Any의 경우에는 동반 객체가 존재하지 않으므로 Any의 동반 객체에 대한 확장은 정의할 수 없다.
class Person(var name: String, var age: Int){ companion object // 확장 정의를 위해 내용이 없는 동반 객체를 정의 } val Person.Companion.UNKNOWN by lazy {Person("John", 25)} fun Any.companion.sayHello() = print("hello") // ERROR : Unresolved reference: companion
1) 람다와 수신 객체 지정 함수 타입
람다나 익명 함수에 대해서도 확장 수신 객체를 활용할 수 있다.
이런 함숫값들은 수신 객체 지정 함수 타입(functional type with receiver)이라는 특별한 타입으로 표현된다.
fun intSet(numbers: IntArray, op: Int.(Int) -> Int): Int{ var res = numbers.firstOrNull() ?: throw IllegalArgumentException("Empty Arr") for(i in 1..numbers.lastIndex) res = res.op(numbers[i]) // 확장 함수 호출 return res } fun sum(numbers: IntArray) = intSet(numbers){ op -> this + op }
수신 객체의 타입은 파라미터 타입 목록 앞에 타입 이름과 점을 이용해 정의할 수 있다.
op: Int.(Int) -> Int
이 경우 함수에 전달된 람다는 암시적으로 수신 객체를 가지며, this를 이용해 이 객체에 접근할 수 있다.
intSet(numbers){ op -> this + op }
익명 함수에 대해서 확장 함수 문법 또한 사용할 수 있다. 수신 객체 타입을 함수의 파라미터 목록 앞에 추가하면 된다.
fun sum(numbers: IntArray) = intSet(numbers, fun Int.(op: Int) = this + op)
확장 함수 정의와 달리 수신 객체가 있는 함숫값을 호출할 때는 수신 객체를 다른 모든 파라미터 앞에 첫 번째 파라미터로 넣어서 확장 함수가 아닌 일반 함수 형태로 호출할 수 있다.
fun intSet(numbers: IntArray, op: Int.(Int) -> Int): Int{ var res = numbers.firstOrNull() ?: throw IllegalArgumentException("Empty Arr") for(i in 1..numbers.lastIndex) res = op(res, numbers[i]) // 일반 함수 호출 return res }
다음글
반응형'Study(종료) > Kotlin 22.09.13 ~ 12.18' 카테고리의 다른 글
6-1. 특별한 클래스 사용하기 : 이넘(enun) 클래스 (0) 2022.10.13 5-5. 고급 함수와 함수형 프로그래밍 활용하기 : 수신 객체가 있는 호출 가능 참조 (0) 2022.10.10 5-3. 고급 함수와 함수형 프로그래밍 활용하기 : 확장 프로퍼티 (0) 2022.10.08 5-2. 고급 함수와 함수형 프로그래밍 활용하기 : 확장 (0) 2022.10.08 5-1. 고급 함수와 함수형 프로그래밍 활용하기 : 코틀린을 활용한 함수형 프로그래밍 (0) 2022.10.08