for loop문에서 객체를 반복할 경우 각 단계마다 그 결과를 반환합니다.
위와 같이 for 문으로 하나의 객체에 여러 원소를 반복하여 제출할 수 있는 객체를 iterable 객체(반복자)라고 합니다. List, Map등의 collection이나 range 객체는 이러한 반복자로 사용할 수 있습니다.
이와 유사한 객체로 코틀린 표준라이브러리에서 제공하는 시퀀스(Sequence)가 있습니다. 이 객체의 여러단계 처리는 전체 단계가 처리된 결과가 요구될 때 실제 연산이 일어납니다.
동작 수행의 순서 또한 다릅니다.
Sequence는 각각 하나의 원소(element)에 대해 모든 단계를 수행한다.
Iterable 은 전체 collection 에 대해 각 단계의 수행을 완료하고 다음 단계로 넘어간다.
따라서, sequence 는 중간 단계의 결과에 대한 처리를 피할 수 있게 해주며, collection 전체 처리에 대한 수행 성능이 향상된다.
하지만 크기가 작은 collection 이나 단순한 연산 동작에 대해서는 오히려 불필요한 오버헤드가 생길 수 있다.
그러므로 어느 경우에 Sequence 나 Iterable 중에 적절한 선택을 해야 한다.
다음은 iterable의 예입니다.
val words1 = "The quick brown fox jumps over the lazy dog"
words1.split(" ")
[The, quick, brown, fox, jumps, over, the, lazy, dog]
다음 예에서 it은 객체에 속한 각각의 원소를 의미합니다.
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
lengthsList
filter: The //println의 반환으로 각 원소를 모두 반환
filter: quick
filter: brown
filter: fox
filter: jumps
filter: over
filter: the
filter: lazy
filter: dog
[quick, brown, jumps, over, lazy] //길이가 3이상인 부분만을 반환
val lengthsListMap=lengthsList.map{ println("length: ${it.length}"); it.length }
lengthsListMap
length: 5
length: 5
length: 5
length: 4
length: 4
[5, 5, 5, 4, 4]
lengthsListMap.take(2)
[5, 5]
위의 과정을 축소하여 다시 실행해 보면 다음과 같습니다.
위의 경우는 객체 words에 실행되는 함수가 filter, map, take로 3개입니다. 객체의 모든 원소가 각각의 함수에 적용된 후 다음 단계로 이관됩니다. 그러나 아래의 Squence 객체는 객체의 각 원소가 3개의 함수에서 실행된후 결과를 반환합니다.
val lst=listOf("rock","pagoda","plastic plant","alligator","flowerpot")
for(i in lst){println(i)}
rock
pagoda
plastic plant
alligator
flowerpot
for(i in lst){println(i)}
rock
pagoda
plastic plant
alligator
flowerpot
위와 같이 for 문으로 하나의 객체에 여러 원소를 반복하여 제출할 수 있는 객체를 iterable 객체(반복자)라고 합니다. List, Map등의 collection이나 range 객체는 이러한 반복자로 사용할 수 있습니다.
이와 유사한 객체로 코틀린 표준라이브러리에서 제공하는 시퀀스(Sequence
동작 수행의 순서 또한 다릅니다.
Sequence는 각각 하나의 원소(element)에 대해 모든 단계를 수행한다.
Iterable 은 전체 collection 에 대해 각 단계의 수행을 완료하고 다음 단계로 넘어간다.
따라서, sequence 는 중간 단계의 결과에 대한 처리를 피할 수 있게 해주며, collection 전체 처리에 대한 수행 성능이 향상된다.
하지만 크기가 작은 collection 이나 단순한 연산 동작에 대해서는 오히려 불필요한 오버헤드가 생길 수 있다.
그러므로 어느 경우에 Sequence 나 Iterable 중에 적절한 선택을 해야 한다.
다음은 iterable의 예입니다.
String 객체.split: 문자열을 메소드에 전달한 인수를 기준으로 분리합니다.
val words1 = "The quick brown fox jumps over the lazy dog"
words1.split(" ")
[The, quick, brown, fox, jumps, over, the, lazy, dog]
객체.filter{인수; 조건} : 객체에서 조건에 해당하는 부분을 반환
다음 예에서 it은 객체에 속한 각각의 원소를 의미합니다.
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
lengthsList
filter: The //println의 반환으로 각 원소를 모두 반환
filter: quick
filter: brown
filter: fox
filter: jumps
filter: over
filter: the
filter: lazy
filter: dog
[quick, brown, jumps, over, lazy] //길이가 3이상인 부분만을 반환
객체.map{실행문}: 객체의 모든 원소들에 실행문을 적용하여 반환합니다.
val lengthsListMap=lengthsList.map{ println("length: ${it.length}"); it.length }
lengthsListMap
length: 5
length: 5
length: 5
length: 4
length: 4
[5, 5, 5, 4, 4]
객체.take(n): 객체의 0~n 번째 까지의 원소를 반환합니다.
lengthsListMap.take(2)
[5, 5]
위의 과정을 축소하여 다시 실행해 보면 다음과 같습니다.
val words = "The quick brown fox jumps over the lazy dog".split(" ")
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
.map { println("length: ${it.length}"); it.length }
.take(4)
println("Lengths of first 4 words longer than 3 chars:")
println(lengthsList)
filter: The
filter: quick
filter: brown
filter: fox
filter: jumps
filter: over
filter: the
filter: lazy
filter: dog
length: 5
length: 5
length: 5
length: 4
length: 4
Lengths of first 4 words longer than 3 chars:
[5, 5, 5, 4]
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
.map { println("length: ${it.length}"); it.length }
.take(4)
println("Lengths of first 4 words longer than 3 chars:")
println(lengthsList)
filter: The
filter: quick
filter: brown
filter: fox
filter: jumps
filter: over
filter: the
filter: lazy
filter: dog
length: 5
length: 5
length: 5
length: 4
length: 4
Lengths of first 4 words longer than 3 chars:
[5, 5, 5, 4]
위의 경우는 객체 words에 실행되는 함수가 filter, map, take로 3개입니다. 객체의 모든 원소가 각각의 함수에 적용된 후 다음 단계로 이관됩니다. 그러나 아래의 Squence 객체는 객체의 각 원소가 3개의 함수에서 실행된후 결과를 반환합니다.
객체.asSequence() : 객체를 Squence 객체로 변환합니다.
val words = "The quick brown fox jumps over the lazy dog".split(" ").asSequence()
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
.map { println("length: ${it.length}"); it.length }
.take(4)
println("Lengths of first 4 words longer than 3 chars:")
println(lengthsList.toList())
Lengths of first 4 words longer than 3 chars:
filter: The
filter: quick
length: 5
filter: brown
length: 5
filter: fox
filter: jumps
length: 5
filter: over
length: 4
[5, 5, 5, 4]
이 차이는 객체에 여러 함수를 적용할 경우 모든 조건에 부합하는 원소가 나올 경우 그 반복문을 중지시켜야 될 경우 사용될 수 있습니다.
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
.map { println("length: ${it.length}"); it.length }
.take(4)
println("Lengths of first 4 words longer than 3 chars:")
println(lengthsList.toList())
Lengths of first 4 words longer than 3 chars:
filter: The
filter: quick
length: 5
filter: brown
length: 5
filter: fox
filter: jumps
length: 5
filter: over
length: 4
[5, 5, 5, 4]
댓글
댓글 쓰기