KotlinInAction/함수 정의와 호출

컬렉션 처리

webmaster 2022. 7. 28. 23:24
728x90

vararg 키워드를 사용하면 호출 시 인자 개수가 달라질 수 있는 함수를 정의할 수 있다

중위 함수 호출 구문을 사용하면 인자가 하나뿐인 메서드를 간편하게 호출할 수 있다.

구조 분해 선언을 사용하면 복합적인 값을 분해해서 여러 변수에 나눠 담을 수 있다.

자바 컬렉션 API 확장

fun main(args: Array<String>) {
    val strings: List<String> = listOf("first", "second", "fourteenth")
    strings.last()
    val numbers: Collection<Int> = setOf(1, 14, 2)
    numbers.max()
}
  • 어떻게 자바 라이브러리 클래스의 인스턴스인 컬렉션에 대해 코틀린이 새로운 기능을 추가할 수 있었을까?
    • last() , max() 모두 확장 함수이기에 가능하다.
  • last는 List 클래스의 확장함수이다.
  • max의 경우에 Collection에, List의 확장 함수이다
  • 모든 확장 함수를 외울 필요가 없이 IDE의 코드 완성 기능을 통해 메서드나 함수를 찾아서 사용하면 된다.

가변 인자 함수 

listOf 함수

public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()

 

  • 가변 인자는 메서드를 호출할 때 원하는 개수만큼 값을 인자로 넘기면 자바 컴파일러가 배열에 그 값들을 넣어주는 기능이다.
  • 타입 뒤에... 붙이는 대신 코틀린에서는 파라미터 앞에 vararg 변경자를 붙인다.
val list = listOf("args: ", *args)
println(list)
  • 이미 배열에 들어있는 원소를 가변 길이 인자로 넘길 때도 코틀린과 자바 구문이 다르다
  • 배열을 명시적으로 풀어서 배열의 각 원소가 인자로 전달되게 해야 한다.
    • 기술적으로는 스프레드 연산자(*)가 그런 작업을 해준다.
  • 스프레드 연산자를 통해 배열에 들어있는 값과 다른 여러 값을 함께 써서 함수를 호출할 수 있다.

중위 호출과 구조 분해 선언

val map = mapOf(1 to "One", 7 to "Seven", 53 to "fifty-three")
  • to는 메서드로 중위 호출이라는 특별한 방식으로 일반 메서드를 호출한 것이다.
  • 중위호출 시에는 수신 객체와 유일한 메서드 인자 사이에 메서드 이름을 넣는다.
    • 1.to("One") ==  1 to "One" 은 같다
  • 인자가 하나뿐인 일반 메서드나 인자가 하나뿐인 확장 함수에 중위 호출을 사용할 수 있다.
  • 함수를 중위 호출에 사용하게 허용하고 싶으면 infix 변경자를 함수 선언 앞에 추가한다.
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
  • Pair는 두 원소로 이뤄진 순서쌍을 표현한다.
  • val (number, name) = 1 to "One"과 같이 즉시 초기화할 수 있다
    • 이런 기능을 구조 분해 선언이라고 부른다
    • 루프에서도 구조 분해 선언을 활용할 수 있다.
for((index, element) in collection.withIndex()){
	println($index : $element)
}
  • 컬렉션 원소의 인덱스와 값을 따로 변수에 담을 수 있다
728x90