Kotlin

Kotlin - 시퀀스의 활용

J_Bin 2022. 6. 21. 16:24

# 요소 값 생성하기

package chap02.section1


/* 시퀀스(Sequence)
    : 순차적인 컬렉션으로 요소의 크기를 특정하지 않고, 나중에 결정할 수 있는 특수한 컬렉션이다.
    예를들어, 특정 파일에서 줄 단위로 읽어서 요소를 만들 때 해당 파일의  끝을 모르면 줄이 언제 끝날지 알 수 없는 경우가 있는데 이럴 때 사용할 수 있다.
*  */

fun main() {


    val nums : Sequence<Int> = generateSequence(1) { it + 1}                    // 시드 값 1을 시작으로 1씩 증가하는 시퀀스 정의
    println(nums.take(10).toList())                                               // take()를 사용해 원하는 요소 개수만큼 획득하고 toList()를 사용해 List 컬렉션으로 반환

    val squares = generateSequence(1) {it+1}.map { it * it }                   // 시드 값 1을 시작으로 1씩 증가하는 시퀀스 정의 + map을 사용하여 제곱수 반환
    println(squares.take(10).toList())                                           // take()를 사용해 원하는 요소 개수만큼 획득하고 toList()를 사용해 List 컬렉션으로 반환

    val oddSquares = squares.filter { it % 2 != 0 }
    println(oddSquares.take(5).toList())

}

# 요소 값 가져오기

package chap02.section1


/* 메서드 체이닝의 중간 결과 생성하기
* 중간 연산 결과 없이 한 번에 끝까지 연산한 후 결과를 반환하려면 asSequence()를 사용할 수 있습니다. 특히 filter나 map을 메서드 체이닝해서
* 사용할 경우 순차적 연산이기 때문에 시간이 많이 걸릴 수 있지만 asSequence()를 사용하면 병렬 처리되기 때문에 처리 성능이 좋아진다.
* */

fun main() {

    /* 단순 메서드 체이닝 */
    val list1 = listOf(1,2,3,4,5)
    val listDefault = list1
        .map { println("map($it)"); it * it}                        // (1)
        .filter { println("filter($it) "); it % 2 == 0 }            // (2)
    //println(listDefault)


    /* asSequence()를 통해 가져오기 */
    val listSeq = list1.asSequence()
        .map { print("map($it) "); it * it }                        // (1)
        .filter { println("filter($it) "); it % 2 == 0 }            // (2)
        .toList()                                                   // (3)
    println(listSeq)

    /**
     * 여기서는 asSequence()를 사용한 다음 바로 map,filter를 이용하여 메서드 체이닝을 했다.
     * 이때 1번 과정과 2번 과정만으로는 결과를 도출할 수 없습니다. 3번 과정에 의해 최종 결과를 List 목록으로 반환할 때,
     * 모든 연산이 수행되고 결과물이 새로운 리스트인 listSeq에 지정됩니다.
     * 결과를 보면 연속적으로 map과 filter가 각각 수행된 것을 알 수 있으며, 최종 결과는 toList()에 의해 만들어진 [4,16]입니다.
     * map의 수행 결과를 새로운 List에 만들고 이것을 다시 짝수인지 판별해 리스트를 만드는 과정이 없어진 것 입니다. 따라서 시퀀스를 사용하면
     * 요소의 개수가 많을 때 속도나 메모리 측면에서 좋은 성능을 낼 수 있습니다.
     */
    

}

# 시퀀스의 활용

package chap02.section1




fun main() {


    // 시퀀스를 이용한 피보나치 수열
    val fibonacci = generateSequence (1 to 1) { it.second to it.first + it.second  }
        .map { it.first }
    println(fibonacci.take(10).toList())

    // 시퀀스를 이용한 소수
    val primes = generateSequence(2 to generateSequence (3) {it + 2}) {
        val currSeq = it.second.iterator()
        val nextPrime = currSeq.next()
        nextPrime to currSeq.asSequence().filter { it % nextPrime != 0 }
    }.map {it.first}
    println(primes.take(10).toList())

    /**
     * 먼저 초기 시드 값은 2부터 시작하고 두 번째 pair 값은 람다식에서 Pair<Int,Sequence<Int>> 형태로 구성되었기 때문에
     * 다시 한번 시퀀스를 생성하고 있습니다. 여기서는 시드 값 3을 사용했습니다. 이후 이 값에서 2씩 더해집니다.
     * 현재 시퀀스의 값과 다음 소수의 값이 나누어 떨어진 값이 0이 아닌 경우를 골라내어 소수를 구성하고 있습니다.
     */
    

}

'Kotlin' 카테고리의 다른 글

Kotlin - 클로저★  (0) 2022.06.21
Kotlin - 람다식과 고차함수(review) ★  (0) 2022.06.21
Kotlin - 컬렉션의 확장 함수  (0) 2022.06.21
Kotlin - 컬렉션  (0) 2022.06.21
Kotlin - 배열  (0) 2022.06.20