val strings : List<String> = listOf("first","second","fourtheeth")
strings.last
>>fourtheeth
val numbers:Collection<Int> = setOf(1,14,2)
number.max
>>14
위의 코드와 같이 last, max는 확장 함수이다.
fun <T>List<T>.last():T { /* 마지막 원소를 반환함 */ }
fun Collection<Int>.max() :Int { /* 컬렉션의 최댓값을 찾음 */ }
코틀린 표준 라이브러리는 수많은 확장 함수를 포함한다
리스트를 생성하는 함수를 호출 할 때 원하는 만큼 많이 원소를 전달 할 수 있다.
val list = listOf(2,3,5,7,11)
라이브러리에서의 함수 정의
fun listOf<T>(vararg values:T):List<T>{ ... }
- 자바의 가변길이는 타입뒤에 ...를 붙이지만 코틀린은 vararg 변경자를 붙인다.
- 가변 길이 인자는 메소드를 호출 할 때 원하는 개수만큼 값을 인자로 넘기면 자바 컴파일러가 배열에 그 값들을 넣어준다.
- 자바에서는 배열을 그냥 넘기면 되지만 코틀린에서는 배열을 명시적으로 풀어서 각 원소가 인자로 전달되게 해야한다. 이걸 기술적으로 스프레드 연산자가 그런 작업을 한다. 실제로 전달하려는 배열 앞에 *를 붙이기만 하면 된다.
--스프레드 연산자
val a = arrayOf(1, 2, 3)
val list = asList(-1, 0, *a, 4)
println(list)
>>[-1, 0, 1, 2, 3, 4]
간단하게 mapOf 함수를 이용해보자
val map = mapOf(1 to "one", 7 to "seven", 53 to "fifity-three")
여기서 to 키워드는 본래 코틀린에 있던 키워드가 아니다.
이 코드는 중위호출(infix call)이라는 특별한 방식으로 to라는 일반 메소드를 호출 한 것이다.
중위 호출 시에는 수신 객체와 유일한 메소드 인자 사이에 메소드 이름을 넣는다.
infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
이 to 함수는 Pair 인스턴스를 반환한다. Pair는 코틀린 표준 라이브러리 클래스로 두 원소 이뤄진 순서쌍을 표현한다.
Pair의 내용으로 두 변수를 즉시 초기화 할 수 있다.
val (number,name) = 1 to "one"
이런 기능을 구조 분해 선언이라 부른다
---중위호출 다른 예
infix fun Int.multiply(x: Int): Int { //infix로선언되므로중위함수
return this * x
}
println(10 multiply 3)
>> 30
--- 구조 분해 선언 다른 예
class Car(private val manufacturer:Any, private val model:Any){
operator fun component1() = manufacturer
operator fun component2() = model
}
val car = Car("현대", "그랜저")
val (manufacturer, model) = car
println("제조사 : $manufacturer, 모델 : $model")