Kotlin
-
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..
-
아이템4 - inferred 타입으로 리턴하지 말라Kotlin/Effective Kotlin 요약 2023. 1. 3. 00:01
타입 추론 코틀린의 타입 추론은 널리 알려진 코틀린의 특징입니다. 자바 10에서도 타입 추론을 도입하였습니다. 타입 추론을 사용하는 경우 절대로 슈퍼클래스 또는 인터페이스로는 설정되지 않습니다 물론 타입을 명시적으로 지정하여 이런 문제를 해결할 수 있습니다. 하지만 직접 라이브러리를 조작할 수 없는 경우에는 이런 문제를 간단하게 해결할 수 없습니다. 인터페이스에서의 위험성 CarFactory 인터페이스 interface CarFactory{ fun produce(): Car } 대부분의 공장에서 Fiat126이라는 자동차를 생상하여, 이를 디폴트로 두었습니다. val DEFAULT_CAR: CAR = Fiat126P() 코드를 작성하다 보니 DEFAULT_CAR는 CAR로 명시적으로 지정되어 있어서 함수..
-
아이템3 - 최대한 플랫폼 타입을 사용하지 말라Kotlin/Effective Kotlin 요약 2022. 12. 31. 00:01
개요 코틀린에서 null-safety는 주요 기능 중 하나입니다. 만약 자바에서 String 타입을 리턴하는 메서드가 존재하고 코틀린에서 이를 사용하려면 어떻게 해야 할까요? @Nullable, @NotNull 어노테이션이 붙어있다면 해당 프로퍼티에 맞게 변환해주면 됩니다. 하지만 어노테이션이 붙어있지 않는다면 안전하게 nullable으로 가정해야 합니다. 하지만 어떤 메서드는 null을 리턴하지 않을 것이 확실할 수 있습니다. 이런 경우에는 not-null을 나타내는 !!를 붙입니다. 이때 자주 문제가 되는 부분이 자바의 제네릭 타입입니다. 코틀린과 자바의 제네릭 타입 코틀린이 디폴트로 모든 타입을 nullable로 다룬다면, 리스트 자체만 널 인지 확인해서는 안 되고, 그 내부에 있는 것들도 널 인지..
-
아이템2 - 변수의 스코프를 최소화하라Kotlin/Effective Kotlin 요약 2022. 12. 29. 00:01
변수의 스코프란? 코틀린의 스코프는 기본적으로 중괄호로 만들어집니다. 내부 스코프에서 외부 스코프에 있는 요소에만 접근할 수 있습니다. val a = 1 fun fizz(){ val b = 2 print(a + b) } //이 위치에서는 a를 사용할 수 있지만, b는 사용할 수 없음 스코프를 최소화하면 장점 - 코드를 분석할 때 추적 관리에 용이합니다. (mutable 보다 immutable 프로퍼티를 선호하는 이유와 동일) - 스코프의 범위가 너무 넓으면 다른 개발자에 의해 변수가 잘못 사용될 수 있습니다. 이런 관점에서 변수를 정의할 때 초기화하는 것이 좋습니다. 여러 프로퍼티를 한꺼번에 설정해야 하는 경우에는 구조 분해 선언을 활용하는 것이 좋습니다. fun main() { updateWeather..