#40 Kotlin Koans Generics/Generic functions 해설

1 소개



Kotlin 공식 레퍼런스의 Kotlin Koans Generics/Generic functions의 해설 기사입니다.

Kotlin Koans를 통해 Kotlin을 배우는 사람들의 도움이 되길 바랍니다.

다만, 레퍼런스를 자력으로 읽는 힘을 기르고 싶은 분은,
곧이 기사를 보지 마십시오!

한 번 각자로 도전하고 나서, 눈에 띄게 된다고 생각합니다

2 Generics



Generic 형 인수(Generic type parameter)는, 호출측이 인수를 건네주도록(듯이) 자유롭게 형태를 지정할 수가 있습니다.

example_Generic1
class TreeNode<T>(val value: T?, val next: TreeNode<T>? = null)
T는 Generic 형식 인수에 해당하며 모든 형식을 지정합니다.

클래스 이름 옆에 < T >와 같이 지정하면,

모든 유형을 T라는 일반 유형 인수로 지정할 수 있음을 나타냅니다.

example_Generic2
fun <T> makeLinkedList(vararg elements: T): TreeNode<T>? {
    var node: TreeNode<T>? = null
    for (element in elements.reversed()) {
        node = TreeNode(element, node)
    }
    return node
}

이 예제에서는 makeLinkedList()를 String 유형의 인스턴스가 호출하면,

모든 TString에 해당합니다.

Generic 형 인수를 이용하는 것으로, 다양한 형태가 공통의 함수나 프로퍼티, 클래스를 이용할 수 있게 됩니다.

3 Generics/Generic functions 해설



Kotlin Koans Generics/Generic functions의 해설입니다.
수시로 본 사이트의 내용을 인용하겠습니다.

본문과 코드를 살펴보자.

Make the following code compile by implementing a partitionTo function that splits a collection into two collections according to the predicate.

There is a partition() function in the standard library that always returns two newly created lists. You should write a function that splits the collection into two collections given as arguments. The signature of the toCollection() .
import java.util.*

fun partitionTo() = TODO()

fun partitionWordsAndLines() {
    val (words, lines) = listOf("a", "a b", "c", "d e").
            partitionTo(ArrayList<String>(), ArrayList()) { s -> !s.contains(" ") }
    words == listOf("a", "c")
    lines == listOf("a b", "d e")
}

fun partitionLettersAndOtherSymbols() {
    val (letters, other) = setOf('a', '%', 'r', '}').
            partitionTo(HashSet<Char>(), HashSet()) { c -> c in 'a'..'z' || c in 'A'..'Z'}
    letters == setOf('a', 'r')
    other == setOf('%', '}')
}
  • partitionWordsAndLines()를 호출하면 List 중 " "을 포함하는 요소와 포함하지 않는 요소의 List를 생성합니다.
  • partitionLettersAndOtherSymbols()를 호출하면 Set 중 記号文字 각각의 Set을 생성합니다.

  • 위의 두 점을 충족시키기 위해 partitionTo()를 구현합니다.
    partitionTo()partitionWordsAndLines()에서 List이고 partitionLettersAndOtherSymbols()에서는 Set가 호출됩니다.

    따라서 partitonTo()Collection에서 호출합니다.

    또한 partitonWordsAndLines()에서 첫 번째 및 두 번째 인수로 ArrayListラムダ式를 전달하고,
    wordslinesList를 반환합니다.
    partitonLettersAndOtherSymols() 내에서는 제 1, 제 2 인수로서 HashSetラムダ式를 건네주고,
    lettersotherSet를 반환합니다.

    그래서 다음과 같은 구현이 됩니다.
    fun <T,C:MutableCollection<T>> Collection<T>.partitionTo(first:C,second:C,predicate:(T) -> Boolean):Pair<C,C>{
    }
    

    호출 원래의 Collection 의 요소가, 인수로서 건네준 람다 식의 조건을 채우는 (true 를 돌려준다) 때,
    first에 요소를 전달하고,

    조건을 충족시키지 못하면(false를 반환할 때), second 에 요소를 전달하도록 구현합니다.

    따라서 최종 구현은 다음과 같습니다.
    import java.util.*
    
    fun <T,C:MutableCollection<T>> Collection<T>.partitionTo(first:C,second:C,predicate:(T) -> Boolean):Pair<C,C>{
        for(element in this){
            if(predicate(element)){
                first.add(element)
            }else{
                second.add(element)
            }
        }
        return Pair(first,second)
    }
    
    fun partitionWordsAndLines() {
        val (words, lines) = listOf("a", "a b", "c", "d e").
                partitionTo(ArrayList<String>(), ArrayList()) { s -> !s.contains(" ") }
        words == listOf("a", "c")
        lines == listOf("a b", "d e")
    }
    
    fun partitionLettersAndOtherSymbols() {
        val (letters, other) = setOf('a', '%', 'r', '}').
                partitionTo(HashSet<Char>(), HashSet()) { c -> c in 'a'..'z' || c in 'A'..'Z'}
        letters == setOf('a', 'r')
        other == setOf('%', '}')
    }
    

    4 마지막으로



    이제 Kotlin koasn에 대한 해설 기사는 최종입니다.

    좋은 웹페이지 즐겨찾기