[Kotlin In Action] 5장 람다로 프로그래밍 정리

우발자·2025년 10월 13일
1

Kotlin In Action - 5장 람다로 프로그래밍부분을 읽다가 도움이 될만한 것들을 정리하는 글이다.


1. 멤버참조

kotlin에서는 람다를 사옹하면 가독성을 향상시키고 보일러플레이트 코드를 줄일 수 있기 때문에 많이 사용한다.

val person = listOf(Person(14, 홍길동), Person(24, 둘리), Person(54, 허준)) 
val oldestPerson = person.maxBy { it.age } 



data class Person(val age : Int, val name : String)

많이들 이런식으로 최대값을 찾을 것이다. 또한 멤버참조를 이용하여 많이 넘기기도 한다.

만약 어떤 함수에 람다를 넘겨야 할 때가 생겼는데 이미 정의된 함수라면 다시 정의된 함수에 로직을 다시 쓰는 건 비효율적일 것이다. 이때 멤버참조를 사용하면 된다.


2. count vs size

개발을 하다보면 컬렉션 api를 사용한 후 크기를 알아야 할 때가 많은데 이때 크기만 알면 된다면 앞으로는 size대신 count를 사용하는걸 권장드린다.
그 이유는 filter를 사용하여 남겨진 원소들에 크기를 구할때 만약 size를 이용한다면 filter에 만족하는 컬렉션이 중간에 하나 더 생기게 된다. 반면 count는 조건에 만족하는 원소를 따로 저장하지 않기 때문에 훨씬 더 효율적이다.

val size = people.filter { it.age > 27 }.size // x
val count = people.count { it.age > 27 } // o

3.지연 계산(lazy) 컬렉션 연산

map이나 filter 같은 몇 가지 컬렉션 함수들은 결과 컬렉션을 즉시 생성한다. 이는 컬렉션 함수를 연쇄하면 매 단계마다 계산 중간 결과를 새로운 컬렉션에 임시로 담는다는 말이다. 원소가 1,2개 일 때는 상관이 없지만 몇백, 몇천개 일때는 성능차이가 달라진다.

val list = listOf(1,2,3,4)

val first = list.map { it * it}.find { it > 3 } // 4 

val firstWithSequence = list.asSequence()
							.map { it * it}
                            .find { it > 3 } // 4
                        

이 때 asSequence로 변환하여 컬렉션 api들을 수행한다면 성능이 향상 될 것이다.

왜그럴까?

동작차이에 있다.

시퀀스를 사용안하면 1, 4, 9 ,16이라는 컬렉션을 하나 임시로 만들 것이다.
그 후 find로 3이상인 원소를 찾을 것이다. 그럼 9, 16까지 굳이 필요했을까?

아니다. 시퀀스는 그 점을 해결해준다.

시퀀스를 사용하면 map에선 1을 먼저 계산한다. 그 뒤 find가 수행되지만 조건에 맞지않아 반환되지 않는다. 그 다음 map에서는 4가 생성되고 find에서 조건이 맞아 4가 반환된다. 결국 map에서는 나머지 3,4에 대한 작업을 수행하지 않아도 되기 때문에 여기서 성능 이점을 찾을 수 있다.

profile
어제보다 나은 개발자가 되자

0개의 댓글