본문 바로가기

728x90
반응형
Effective 시리즈 7

[Effective Kotlin] Item 52: Limit the number of operations 모든 collection 처리 함수는 비용이 발생합니다. 따라서 수집 처리 단계의 수를 제한하고, 주로 복합 작업을 사용하여 이를 수행합니다. 복합작업은 아래의 예를 보면 이해하기 쉽습니다. 1. null이 아닌 것을 필터링한 다음 2. null을 허용하지 않는 타입으로 캐스팅 하는 대신 filterNotNull을 사용합니다. 1. null을 매핑한 다음 2. 필터링 하는 대신 mapNotNull을 수행할 수 있습니다. class Student(val name: String?) // Works fun List.getNames(): List = this .map { it.name } .filter { it != null } .map { it!! } // Better fun List.getNames(): L.. 2021. 10. 28.
[Effective Kotlin] Item 45: Consider extracting non-essential parts of your API into extensions Intro API의 중요하지 않은 부분을 익스텐션으로 추출하는 것을 고려하세요. 클래스에서 final 메서드를 정의할 때, 멤버로 정의할지, 익스텐션 함수로 정의할지 결정해야 합니다. // 메서드를 멤버로 정의 class Workshop(/*...*/) { //... fun makeEvent(date: DateTime): Event = //... val permalink get() = "/workshop/$name" //커스텀 get } // 메서드를 확장함수로 정의 class Workshop(/(...(/) { //... } fun Workshop.makeEvent(date: DateTime): Event = //... val Workshop.permalink get() = "/workshop/$nam.. 2021. 10. 28.
[Effective Kotlin] Item 38: Use function types or functional interfaces to pass operations and actions Summary 행동을 나타내기 위해, 표준 인터페이스나 추상 클래스 대신 함수 타입이나 함수형 인터페이스를 선호합시다. 함수 타입이 좀 더 자주 사용 됩니다. 여러 번 사용되거나 타입이 길어지면 type alias를 사용합시다. 함수형 인터페이스는 주로 Java 상호 운용성을 위해 선호되며, 표현하려는 것이 임의의 함수 이상으로 복잡한 경우에 선호됩니다. (요약만 봐서는 사실 잘 이해가 안된다 살펴보자!) Intro 많은 언어에는 fuction type이라는 개념이 없습니다. 대신 하나의 메소드를 갖는 interface를 사용합니다. 이런 인터페이스를 SAM(Single-Abstract Method)이라고 합니다. 아래 예시는 view를 클릭할 때 발생해야 하는 정보를 전달하는데 사용되는 SAM의 예입니.. 2021. 10. 7.
[Effective Kotlin] Item 31: Define contract with documentation Intro 문서로 약속을 정의해라. Item 27: Use abstraction to protect code against change 에서 나왔던 '메세지를 보여주는 함수'에 대해서 다시 보겠습니다. fun Context.showMessage( message: String, length: MessageLengh = MessageLength.LONG ) { val toastLength = when(length) { SHORT -> Toast.LENGTH_SHORT LONG -> Toast.LENGTH_LONG } Toast.makeText(this, message, toastLength).show() } enum class MessageLength { SHORT, LONG } 위 코드는 어떻게 메세지를 .. 2021. 9. 11.
[Effective Kotlin] Item 24: Consider variance for generic types Intro 아래의 generic class를 보면, 타입 파라미터인 T는 out이나 in과 같은 제네릭 변성 한정자(generic variance modifier)가 없기 때문에 타입 변경이 불가능합니다(invariant). 이 말은 generic class에 의해 생성된 서로 다른 타입 사이에는 관계가 없다는 것을 의미하는데요. class Cup fun main() { val anys: Cup = Cup() //Error: Type mismatch val nothings: Cup = Cup() //Error } 예를 들면, Cup와 Cup, Cup와 Cup사이에는 관계가 없습니다. 만약, 관계가 필요하다면 out이나 in과 같은 제네릭 한정자를 사용해야 합니다. out은 type parameter를 공.. 2021. 9. 9.
[Effective Kotlin] Item 17: Consider naming arguments Intro val text = (1..10).joinToString("|") 위와 같은 예시가 있을 때, joinToString에 대해서 모른다면 "|"이 seperator라는 것을 알기 어렵고, 명확하지 않습니다. (물론 요즘은 IntelliJ와 같은 IDE가 잘알려주지만,,, 그래도!) 가장 좋은 방법은 naming argument를 사용하는 것 입니다. 아래처럼요! val text = (1..10).joinToString(separator = "|") 비슷한 방법으로 naming variable이 있습니다. val separator = "|" val text = (1..10).joinToString(separator) 위의 경우, naming argument보다는 좀 덜 안정적입니다. 변수 명은 개.. 2021. 8. 25.
728x90
반응형