Kotlin/Effective Kotlin 요약
-
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. 테스트를 통과시키는 것을 목적으로 하나씩 구현해나가기 단위 테스트의 장점 리팩터링 하는 것이 두렵지 않습니다. 테스트가 있기 때문에 리팩터링 했을 때 버그가 생기는지 쉽게 확인할 수 있습니다. 수동으로 테스트하는것보다 훨씬 빠르게 테스트할 수 있습니다. 단위 테스트의 단점 테스트를 만드는 데 시간이 걸립니다. 테스트를 활용할 수 있게 코드를 조정해야 합니다. 좋은 단위 테스트를 만드는 작업이 꽤 어렵습니다. 다음과 같은 부분에 테스트를 적용하면 좋습니다. - 복잡한 부분 - 계속해서 수정이 일어나고 리..
-
9장 - use를 사용하여 리소스를 닫아라Kotlin/Effective Kotlin 요약 2023. 1. 25. 00:01
close 메서드를 사용해서 명시적으로 닫아야 하는 리소스들 - InputStream, OutputStream - sql.Connection - java.io.Reader - Socket과 Scanner 보통 이런 리소스들은 AutoCloseable을 상속받는 Closeable 인터페이스를 구현하고 있습니다. 전통적으로 이런 리소스는 다음과 같이 try-finally 블록을 사용해서 처리합니다. var socket: Socket? = null var inputStream: InputStream? = null var reader: InputStreamReader? = null try { socket = Socket("thdev.tech", 80) inputStream = socket.getInputStre..
-
8장 - 적절하게 null을 처리하라Kotlin/Effective Kotlin 요약 2023. 1. 24. 00:01
null이 의미하는 바 값이 부족하다는 것을 의미하며 프로퍼티의 값이 설정되어있지 않거나 제거되었음을 의미합니다. 함수가 null을 반환한다는 것은 여러 의미를 가집니다. -. firstOrNull에서 주어진 조건에 맞는 요소가 존재하지 않음 - String.toIntOrNull에서 String을 Int로 적절하게 변환할 수 없음 이처럼 null은 명확한 의미를 주어야 합니다. null 처리법 null은 대게 API를 사용하는 사용자가 처리합니다. 기본적으로 null은 3가지 방법으로 처리합니다. -?. , 스마트 캐스팅, Elvis 연산자 사용 - 예외 throw - nullable 하지 않도록 리팩터링 의도적으로 예외 throw 하기 만약?. 을 사용할 경우 개발자가 null이 되리라 예상하지 못했다..
-
7장 - 결과 부족이 발생할 경우 null과 Failure를 사용하라Kotlin/Effective Kotlin 요약 2023. 1. 22. 00:01
개요 함수가 원하는 결과를 만들어낼 수 없는 경우가 발생할 수 있습니다. 다음과 같은 상황이 예시로 존재합니다. - 서버로부터 데이터를 읽어 들이려 했지만 인터넷 연결 문제가 발생한 경우 - 조건에 맞는 첫 번째 요소를 찾으려 했지만 찾을 수 없는 경우 - 텍스트를 파싱해서 객체를 만드려고 했지만 텍스트의 형식이 맞지 않는 경우 이런 상황을 어떻게 처리하면 좋을까요? 다양한 처리 방법들 - 예외를 throw 한다 - null 또는 실패를 나타내는 sealed 클래스를 리턴한다(대게 이름을 Failure 사용) 이때 예외는 정보를 전달되는 방식으로 사용되서는 안 됩니다. 예외적인 상황이 발생했을 때 사용하는 것이 좋습니다. 예를 들어 JPA를 사용하여 findByID로 특정 ID값을 가진 하나의 객체를 조..
-
6장 - 사용자 정의 오류보다는 표준 오류를 사용하라Kotlin/Effective Kotlin 요약 2023. 1. 21. 00:01
개요 언어에서 표준으로 제공하는 오류가 존재하고 어떤 경우에는 적절하게 제공하지 않는 경우가 있습니다. require, check, assert를 사용하면 대부분의 오류를 처리할 수 있습니다. 하지만 JSON을 파싱 할 때 발생하는 오류는 JSONParsingException 등을 발생시키는 것이 적절할 수 있습니다. 표준 오류 vs 사용자 정의 오류 Effective Kotlin에서는 표준 오류를 사용할 수 있다면 사용하는 것을 권장하고 있습니다. 많은 개발자들이 널리 알고 있기 때문에 API를 더 쉽게 배우고 이해할 수 있게 됩니다. 개인적인 의견 여기에 추가적으로 에러 메시지까지 전달한다면 더 전달력이 높아질 수 있을 것 같습니다. 또는 사용자 정의 오류를 사용한다면 에러코드를 정의하여 한눈에 어떤..
-
아이템5 - 예외를 활용해 코드에 제한을 걸어라Kotlin/Effective Kotlin 요약 2023. 1. 4. 00:01
동작 제한 방법 코틀린에서 코드의 동작을 제한하는 다양한 방법들이 존재합니다. - require - check - assert(in test) - return 또는 throw와 함께 활용하는 Elvis 연산자 제한으로 발생하는 다양한 장점 - 문서를 읽지 않은 개발자도 문제를 확인할 수 있다 - 문제가 발생할 때 예외를 던집니다. - 스마트 캐스트 기능을 활용할 수 있어, 타입 변환을 적게 할 수 있습니다. - 코드가 자체적으로 검사되어 단위 테스트를 줄일 수 있다. 아규먼트 제한 아규먼트에 제한을 거는 다양한 예시를 살펴보겠습니다. - 숫자가 양의 정수여야 한다. - 비어있지 않은 좌표 목록이 필요하다. - 이메일 형식이 올마른지 확인한다. require(n>=0) // n: Int require(po..