Kotlin/Effective Kotlin 요약
-
44장 - 멤버 확장 함수의 사용을 피하라Kotlin/Effective Kotlin 요약 2023. 4. 7. 00:01
확장 함수를 멤버 함수로 정의 어떤 클래스에 대한 확장 함수를 정의할 때, 이를 멤버로 추가하는 것은 좋지 않습니다. 예를 들어 클래스 내부에 멤버로 정의할 수 있습니다. class PhoneNumberIncorrect{ fun String.isPhoneNumber(): Boolean = length == 7 && all {it.isDigit()} } fun main() { println(PhoneNumberIncorrect().apply {"1234567890".isPhoneNumber()}) } 확장 함수의 가시성 제한 private fun String.isPhoneNumber(): Boolean = length == 7 && all {it.isDigit()} fun main() { println("..
-
43장 - API의 필수적이지 않은 부분을 확장 함수로 추출하라Kotlin/Effective Kotlin 요약 2023. 4. 6. 00:01
메서드 VS 확장함수 클래스의 메서드를 정의할 때는 메서드를 멤버로 정의할 것이지 아니면 확장함수로 정의할 것인지 결정해야 합니다. 두 방식 중에 어떤 방식이 우월하다고 할 수 없습니다. 장단점을 비교하여 상황에 맞게 사용해야 합니다. 메서드로 정의하기 class Workshop(){ fun makeEvent(text: String){ println("make Event $text") } } fun main() { val workshop = Workshop() workshop.makeEvent("1") //make Event 1 } 확장 함수로 정의하기 class Workshop(){} fun Workshop.makeEvent(text: String){ println("make Event $text") ..
-
42장 - compareTo 규약을 지켜라Kotlin/Effective Kotlin 요약 2023. 4. 5. 00:01
compareTo 메서드 compareTo는 Any클래스에 있는 메서드는 아닙니다. 수학적인 부등식으로 변환되는 연산자입니다. fun main() { val str1 = "a" val str2 = "b" println(str1 > str2) //str1.compareTo(str2) > 0 println(str1 = str2) //str1.compareTo(str2) >= 0 println(str1 = a 라면 a==b이어야 한다. 연속적 동장 a >=b 이고 b>=c 라면 a>=c여야 한다. 그렇지 않다면 무한 반복에 빠질 수 있다. 코네스적 동작 두 요소는 확실한 관계를 가지고 있어야 합니다. a>=b 또는 b>=a..
-
41장 - hashCode의 규약을 지켜라Kotlin/Effective Kotlin 요약 2023. 4. 4. 00:01
해시 테이블 해시 테이블은 각 요소에 숫자를 할당하는 함수가 필요합니다. 이 함수를 해시 함수라고 부릅니다. 같은 요소라면 항상 같은 숫자를 리턴합니다. 해시 함수가 다음과 같은 특성을 가지는 것이 좋습니다. 빠르다. 충돌이 적다 해시 함수는 각각의 요소에 특정한 숫자를 할당하고, 이를 기반으로 요소를 다른 버킷에 넣습니다. 해시 함수의 기본조건인 같은 요소라면 항상 같은 숫자를 리턴한다에 의해 같은 요소는 항상 동일한 버킷에 넣게 됩니다. 가변성과 관련된 문제 요소를 추가할 때만 해시 코드를 계산합니다. 즉, 요소가 변경되어도 해시 코드는 계산되지 않으며 버킷의 재배치로 이루어지지 않습니다. Set과 Map의 키로 mutable 요소를 사용하면 안 되며, 사용하더라도 요소를 변경하면 안 됩니다. has..
-
40장 - equals 규약을 지켜라Kotlin/Effective Kotlin 요약 2023. 3. 29. 00:01
Any의 규약 equals hashCode toString 주석과 문서에 잘 설명되어 있는 규약들입니다. 자바에서부터 정의되어 있던 메서드라서 코틀린에서 중요한 위치를 차지하고 있습니다. 위의 규약을 위반하면 일부 객체 또는 기능이 제대로 동작하지 않을 수 있습니다. 동등성 코틀린에는 두 가지 종류의 동등성이 있습니다. 구조적 동등성(equals 메서드를 기반으로 비교) , 사용하는 연산자 == 레퍼런스적 동등성(가리키는 주소를 비교) , 사용하는 연산자 === equals가 필요한 이유 Any 클래스에 구현되어 있는 equals는 디폴트로 ===처럼 두 인스턴스가 완전히 같은 객체인지 비교합니다. class Name(val name: String) fun main() { val name1 = Name(..
-
39장 - 태그 클래스보다는 클래스 계층을 사용하라Kotlin/Effective Kotlin 요약 2023. 3. 28. 00:01
태그 클래스 class ValueMatcher private constructor( private val value: T? =null, private val matcher: Matcher ){ fun match(value: T?) = when(matcher){ Matcher.EQUAL -> value == this.value Matcher.LIST_EMPTY -> value is List && value.isEmpty() } enum class Matcher{ EQUAL, LIST_EMPTY, } companion object{ fun equal(value: T) = ValueMatcher(value = value, matcher = Matcher.EQUAL) fun emptyList() = ValueM..
-
38장 - 연산 또는 액션을 전달할 때는 인터페이스 대신 함수 타입을 사용하라Kotlin/Effective Kotlin 요약 2023. 3. 27. 00:01
대부분의 프로그래밍 언어에는 함수 타입이란 개념이 없습니다. 보통 Single-Abstract-Method이라 불리는 메서드가 하나만 있는 인터페이스를 활용합니다. interface OnClick{ fun clicked(view: View) } //함수가 SAM을 받음 fun setOnClickListener(listener: OnClick){ //... } //함수 타입을 사용하는 코드로 변경 fun setOnClickListener(listener: (View) -> Unit){ //... } 함수 타입을 사용하는 코드를 활용한다면 많은 자유를 얻을 수 있습니다. 람다 표현식 또는 익명 함수로 전달 함수 레퍼런스 또는 제한된 함수 레퍼런스로 전달 선언된 함수 타입을 구현한 객체로 전달 SAM의 장점은..
-
37장 - 데이터 집합 표현에 data 한정자를 사용하라Kotlin/Effective Kotlin 요약 2023. 3. 26. 00:01
데이터들을 전달해야 할 때 일반적으로 data 한정자를 활용합니다. 다음과 같은 몇 가지 함수가 자동으로 생성됩니다. toString equals와 hashCode copy componentN 생소한 componentN에 대해서만 알아보면 다음과 같이 가능합니다. data class Player( val id: Int, val name: String, val pts: Int, ) fun main() { val player = Player(0, "jun", 1) val (id, name, pts) = player println(pts) //1 출력 } 튜플 대신 데이터 클래스 활용하기 여기서 튜플이란 Pair, Triple으로 코틀린에서 지원합니다. 하지만 튜플을 사용하면 가독성이 매우 떨어지게 됩니다. ..