2024/03 5

아이템15) 리시버를 명시적으로 참조하라

이펙티브 코루틴을 요약한 내용입니다 명시적으로 긴 코드를 사용할 때가 있음 함수와 프로퍼티를 지역 또는 톱레벨 변수가 아닌 다른 리시버로부터 가져온다는 것을 나타낼 때 class User: Person() { private var beersDrunk: Int = 0 fun drinkBeers(num: Int) { this.beersDrunk += num } } 확장 리시버를 명시적으로 참조하게 할 수 있음 리시버를 명시적으로 표시하지 않은 퀵소트 구현 fun List.quickSort(); List { if (size < 2) { return this } val pivot = first() val (smller, bigger) = drop(1).partition { it < pivot } return s..

아이템14) 변수 타입이 명확하지 않은 경우 확실하게 지정하라

이펙티브 코루틴을 요약한 내용입니다 코틀린은 수준 높은 타입 추론 시스템을 갖추고 있음 val num = 10 val name = "Marcin" val ids = listOf(12, 112, 554, 997) 유형이 명확하지 않을 때는 남용하면 좋지 않음 val data = getSomeData() 가독성을 위해 코드를 설계할 때 읽는 사람에게 중요한 정보를 숨겨서는 안됨 코드 정의로 쉽게 이동할 수 없는 Github 등이 환경에서 코드를 읽을 수도 있음 타입을 지정해주면 코드를 쉽게 읽을 수 있음 val data: UserData = getSomeData() 가독성 향상 이외에 안전을 위해서도 타입을 지정하는 것이 좋음 타입은 개발자와 컴파일러 모두에게 중요한 정보

아이템13) Unit?을 리턴하지 말라

이펙티브 코루틴을 요약한 내용입니다 함수에서 Unit?을 리턴한다면, 그 이유는 무엇일까요? Boolean이 true또는 false를 갖는 것처럼, Unit?은 Unit 또는 null이라는 값을 가질 수 있음 Boolean과 Unit? 타입은 서로 바꿔서 사용할 수 있음 Boolean으로 사용한 코드 fun keyIsCorrect(key: String): Boolean = //... if (!keyInCorrect(key)) return Unit?으로 사용하는 경우 fun verifyKey(key: String): Unit? = //... verifyKey(key) ?: return 코드를 작성할 떄는 멋있게 보일 수도 있겠지만, 읽을 때는 그렇지 않음 Unit?으로 Boolean을 표현하는 것은 오해의..

아이템12) 연산자 오버로드를 할 때는 의미에 맞게 사용하라

이펙티브 코루틴을 요약한 내용입니다 연산자 오버로딩은 강력한 기능이지만 ‘큰 힘에는 큰 책임이 따른다’라는 말처럼 위험할 수 있음 연산자 오버로딩의 매력 fun Int.factorial(): Int = (1..this).product() fun Iterable.product(): Int = fold(1) { acc, i -> acc * i } Int 확장 함수로 정의되어 있으므로, 편리하게 사용할 수 있음 print(10 * 6.factorial()) // 7200 연산자 오버로딩을 활용하면 !기호로 팩토리얼을 표현할수 있음 이렇게 사용하면 안됨 operator fun Int.not() = factorial() print(10 * !6) // 7200 함수의 이름이 not이므로 논리 연산에 사용해야지, ..

아이템11) 가독성을 목표로 설계하라

이펙티브 코루틴을 요약한 내용입니다 개발자가 어떤 코드를 작성하는 것보다 읽는 데 많은 시간을 소모한다 오류를 찾기 위해 코드를 작성할 때보다 오랜 시간 코드를 읽게 됨 프로그래밍은 쓰기보다 읽기가 중요함 항상 가독성을 생각하면서 코드를 작성 인식 부하 감소 가독성은 사람에 따라 다르게 느낄 수 있음 일반적으로 ‘경험’과 ‘인식에 대한 과학’으로 만들어진 어느 정도의 규칙이 있음 // 구현 A if (person != null && person.isAudult) { view.showPerson(person) } else { view.showError() } // 구현 B person?.takeIf { it.isAdult } ?.let(view::showPerson) ?: view.showError() A..