#40 Kotlin Koans Generics/Generic functions 해설
1 소개
Kotlin 공식 레퍼런스의 Kotlin Koans Generics/Generic functions의 해설 기사입니다.
Kotlin Koans를 통해 Kotlin을 배우는 사람들의 도움이 되길 바랍니다.
다만, 레퍼런스를 자력으로 읽는 힘을 기르고 싶은 분은,
곧이 기사를 보지 마십시오!
한 번 각자로 도전하고 나서, 눈에 띄게 된다고 생각합니다
2 Generics
Generic 형 인수(Generic type parameter)는, 호출측이 인수를 건네주도록(듯이) 자유롭게 형태를 지정할 수가 있습니다.
example_Generic1class TreeNode<T>(val value: T?, val next: TreeNode<T>? = null)
T
는 Generic 형식 인수에 해당하며 모든 형식을 지정합니다.
클래스 이름 옆에 < T >
와 같이 지정하면,
모든 유형을 T
라는 일반 유형 인수로 지정할 수 있음을 나타냅니다.
example_Generic2fun <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 유형의 인스턴스가 호출하면,
모든 T
가 String
에 해당합니다.
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('%', '}')
}
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 유형의 인스턴스가 호출하면,모든
T
가 String
에 해당합니다.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('%', '}')
}
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
와 ラムダ式
를 전달하고,words
및 lines
는 List
를 반환합니다.partitonLettersAndOtherSymols()
내에서는 제 1, 제 2 인수로서 HashSet
와 ラムダ式
를 건네주고,letters
및 other
는 Set
를 반환합니다.그래서 다음과 같은 구현이 됩니다.
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에 대한 해설 기사는 최종입니다.
Reference
이 문제에 관하여(#40 Kotlin Koans Generics/Generic functions 해설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/G-o/items/e70fb377ca7c96241776
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(#40 Kotlin Koans Generics/Generic functions 해설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/G-o/items/e70fb377ca7c96241776텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)