코틀린 컬렉션 처리

siwan·2021년 11월 11일
0

컬렉션을 처리할 때 쓸수 있는 코틀린 표준 라이브러리 함수

  • vararg 키워드를 사용하면 호출 시 인자 개수가 달라질 수 있는 함수를 정의할 수 있다.
  • 중위(infix)함수 호출 구문을 사용하면 인자가 하나뿐인 메소드를 간편하게 호출 할 수 있다.
  • 구조 분해 선언을 사용하면 복합적인 값을 분해해서 여러 변수에 나눠 담을 수 있다.

자바 컬렌션 API 확장

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>{ ... }
  1. 자바의 가변길이는 타입뒤에 ...를 붙이지만 코틀린은 vararg 변경자를 붙인다.
  2. 가변 길이 인자는 메소드를 호출 할 때 원하는 개수만큼 값을 인자로 넘기면 자바 컴파일러가 배열에 그 값들을 넣어준다.
  3. 자바에서는 배열을 그냥 넘기면 되지만 코틀린에서는 배열을 명시적으로 풀어서 각 원소가 인자로 전달되게 해야한다. 이걸 기술적으로 스프레드 연산자가 그런 작업을 한다. 실제로 전달하려는 배열 앞에 *를 붙이기만 하면 된다.
--스프레드 연산자
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), 구조 분해(Destructuring) 선의 또 다른 예
---중위호출 다른 예

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")
 
profile
station3 다방 안드로이드 개발자

0개의 댓글