Kotlin
-
17장 - 이름 있는 아규먼트를 사용하라Kotlin/Effective Kotlin 요약 2023. 2. 16. 00:01
이름 있는 아규먼트란? val iDontLikeThis: String = (1..10).joinToString("|") val iLikeThis: String = ((1..10).joinToString(separator = "|")) val separator: String = "|" val iLoveThis: String = ((1..10).joinToString(separator = separator)) println(iLikeThis) //결과 : 1|2|3|4|5|6|7|8|9|10 joinToString 메서드를 잘 아는 사람은 |가 separator를 의미함을 잘 알 수 있습니다. 하지만 모른다면, 이를 접두사로 생각할 수도 있습니다. 파라미터의 이름을 명확하게 직접 지정하는 방법을 이름 있는 ..
-
16장 - 프로퍼티는 동작이 아니라 상태를 나타내야 한다Kotlin/Effective Kotlin 요약 2023. 2. 15. 00:01
코틀린의 프로퍼티는 자바의 필드와 비슷해 보입니다. //Kotlin의 프로퍼티 var name: String? = null //Java의 필드 String name = null; 둘은 유사해 보이지만 프로퍼티는 사용자 정의 게터와 세터를 가질 수 있습니다. fun main() { val custom = Custom() println(custom.myClassField) custom.myClassField = "hi" println(custom.myClassField) } class Custom{ var myClassField: String = "hi" get(){ if(field == "hi") { return "안녕" } return field } set(value){ field = "customSet..
-
15장 - 리시버를 명시적으로 참조하라Kotlin/Effective Kotlin 요약 2023. 2. 13. 00:01
This 대표적으로 함수와 프로퍼티를 지역 또는 톱 레벨 변수가 아닌 다른 리시버로부터 가져온다는 것을 나타낼 때가 있습니다. 예를 들어 클래스의 메서드라는 것을 나타내기 위한 this가 있습니다. class User: Person(){ private var beersDrunk: Int = 0 fun drinkBeers(num: Int){ this.beersDrunk += num } } 명시적으로 표현하지 않음 vs 명시적으로 표현 fun List.quickSort(): List{ if(size < 2) return this ... } 명시적이지 않은 구현입니다. fun List.quickSort(): List{ if(this.size < 2) return this ... } 명시적인 구현입니다. 두 함..
-
14장 - 변수 타입이 명확하지 않은 경우 확실하게 지정하라Kotlin/Effective Kotlin 요약 2023. 2. 12. 00:01
타입 추론 시스템 코틀린은 개발자가 타입을 지정하지 않아도 자동으로 타입을 추론하여 넣어줍니다. 이를 통해 코드가 짧아지며 개발시간을 줄여줄 수 있습니다. 하지만 타입이 명확하지 않다면 남용하지 않는것이 좋습니다. val num = 10 val data = getSomeData() num을 타입은 Int입니다. data의 타입은 무엇일까요? 코드를 읽으면서 함수 정의를 보며 타입을 확인하면 되지 않나? 라고 생각할 수 있습니다. 하지만 이는 곧 가독성이 떨어진다는 것을 의미합니다. val data: UserData = getSomeData() 이와 관련되어 아이템3: 최대한 플랫폼 타입을 사용하지 말라, 아이템4: inferred 타입으로 리턴하지 말라가 있습니다. 타입은 개발자와 컴파일러 모두에게 중요..
-
13장 - Unit?을 리턴하지 말라Kotlin/Effective Kotlin 요약 2023. 2. 11. 00:01
일반적으로 Unit?을 사용한다는 것 Unit은 공식문서에서 볼 수 있듯 한 가지 값을 가질 수 있는 타입을 나타내는 객체이다. Java에서 void 와 비슷한 타입으로 볼 수 있다. Unit?을 하면 null을 반환하거나 아무것도 반환하지 않습니다. 지금까지 여러 코드를 보면서 Unit?을 쉽게 읽을 수 있는 경우는 거의 보지 못했습니다. 기본적으로 Unit?을 리턴하거나, 이를 기반으로 연산하지 않는 것이 좋습니다.
-
12장 - 연산자 오버로드 할 때는 의미에 맞게 사용하라Kotlin/Effective Kotlin 요약 2023. 2. 10. 00:01
팩토리얼을 구하는 함수 fun main() { print(6.factorial()) } fun Int.factorial(): Int = (1..this).product() fun Iterable.product(): Int = fold(1) {acc, i -> acc * i} //출력결과 : 720 팩토리얼은 다음과 같이 ! 기호를 사용해 표기하는 것을 우리는 알고 있습니다. 코틀린은 이런 연산자를 지원하지 않지만 다음과 같이 연산자 오버로딩을 활용하면 만들어낼 수 있습니다. fun main() { print(!6) print(6.not()) } operator fun Int.not() = factorial() fun Int.factorial(): Int = (1..this).product() fun It..
-
11장 - 가독성을 목표로 설계하라Kotlin/Effective Kotlin 요약 2023. 2. 9. 00:01
개요 널리 알려진 이야기로 개발자가 코드를 작성하는데 1분 걸리지만 읽는 데는 10분이 걸립니다. 실제로 프로젝트를 진행할 때 코드 한 줄 고치기 위해 몇 주 동안 코드를 살피는 상황도 많습니다. 프로그래밍은 쓰기보다 읽기가 더 중요하며 가독성을 항상 고려하며 코드를 작성해야 합니다. 인식 부하 감소 //구현 A if(person != null && person.isAdult){ view.showPerson(person) } else { view.showError() } //구현 B person?.takeIf {it.isAduilt} ?.let(view::showPerson) ?: view.showError() A가 B보다 읽기 쉽습니다. B는 경험많은 코틀린 개발자라면 코드를 쉽게 읽을 수 있지만 대부..
-
10장 - 단위 테스트를 만들어라Kotlin/Effective Kotlin 요약 2023. 1. 26. 00:01
코드를 안전하게 만들기 사용자의 관점에서 애플리케이션이 외부적으로 제대로 작동하는지 확인하기 위해서는 단위 테스트가 필요합니다. TDD TDD라는 접근 방식도 존재합니다. 1. 테스트를 먼저 작성하고 2. 테스트를 통과시키는 것을 목적으로 하나씩 구현해나가기 단위 테스트의 장점 리팩터링 하는 것이 두렵지 않습니다. 테스트가 있기 때문에 리팩터링 했을 때 버그가 생기는지 쉽게 확인할 수 있습니다. 수동으로 테스트하는것보다 훨씬 빠르게 테스트할 수 있습니다. 단위 테스트의 단점 테스트를 만드는 데 시간이 걸립니다. 테스트를 활용할 수 있게 코드를 조정해야 합니다. 좋은 단위 테스트를 만드는 작업이 꽤 어렵습니다. 다음과 같은 부분에 테스트를 적용하면 좋습니다. - 복잡한 부분 - 계속해서 수정이 일어나고 리..