배운 내용
1. p.358 읽으면서 인터페이스-구현체로 문제를 해결할 수도 있지 않은가? 라는 생각을 했었는데, 363쪽에 노트에서 이에 대한 내용이 있었다. 간단한 로직의 경우에는 if else 구문으로 사용해도 좋을 듯하다.
찾아본 내용
1. When to Use Sequences
operation count
- 컬렉션은 중간 컬렉션을 계속 생성하므로, 많은 operation을 가지는 chain에서는 sequence가 낫다.
short-circuiting operations
- collection ~= bfs
- sequence ~= dfs
- 따라서 take(), contains(), indexOf(), any(), none(), find(), first() 와 같은 short-circuiting operation은 sequence가 낫다.
resizable collection
- toList(), toSet() 등 어차피 가변 배열로 묶을거면 컬렉션 스트림이 낫다. (특히 사이즈가 같은 경우)
- forEach() 와 같이 결과를 collecting 하지 않는 경우 시퀀스가 낫다
stateless and stateful operation
- sort, distinct는 모든 원소의 상태를 알아야 가능하다. 따라서 collection이 낫다.
- stateless한 operation의 경우 sequence가 낫다.
* sort의 경우 sequence에서는 내부적으로 mutableList를 만들고, 다시 iterator를 만들기 때문에 굳이 쓸 필요없다
generators
- 시퀀스가 메서드는 많이 없지만, 그만큼 제한이 없어 무한 스트림 등 생성 가능
available operations
- 시퀀스는 앞에서부터의 연산만 제공하는 반면, 컬렉션 스트림은 뒤에서의 연산까지도 제공한다
- fold, reduce, take, drop, slicing, reversing, union, intersect, getOrnull, random
2. Effective Kotlin Item 51: Use the inline modifier for functions with parameters of functional types
A type argument can be reified
- 인라인되므로 타입 추론이 가능해진다 (소거되지 않음)
Functions with functional parameters are faster when they are inlined
- repeat, repeatNoinline 예시에서 non inline은 함수 객체가 매번 생성된다 -> 속도 2~3배 차이
(js의 함수 == 1급 객체 개념, 그러나 jvm에서는 무명클래스나 클래스 객체로 생성될 수 밖에 없음)
- 특히 지역변수 사용, 참조변수 사용으로 나뉘는 경우에는 거의 10배가량 차이
Non-local return is allowed
- non local return 사용 가능
Costs of inline modifiers
- restricted visibility (inline함수에서는 private 함수 호출 불가능) => 캡슐화 불가능해서 클래스에서는 사용되지 않고, 유틸리티 함수에서만 사용
- 재귀 불가능 -> 사이클 매우 위험
- 코드가 심하게 길어질 수 있다
Crossinline and noinline
- crossinline : inline 가능, non local return 불가능
- noinline : 둘 다 불가능
'독서' 카테고리의 다른 글
[코틀린 인 액션] 10장. 애너테이션과 리플렉션 (0) | 2024.05.26 |
---|---|
[코틀린 인 액션] 9장. 제네릭스 (0) | 2024.05.19 |
[코틀린 인 액션] 6장. 코틀린 타입 시스템 (1) | 2024.04.21 |
[코틀린 인 액션] 5장. 람다로 프로그래밍 (0) | 2024.04.14 |
[코틀린 인 액션] 4장. 클래스, 객체, 인터페이스 (1) | 2024.04.07 |