Kotlin/Effective Kotlin 요약
-
28장 - API 안정성을 확인하라Kotlin/Effective Kotlin 요약 2023. 3. 14. 00:01
표준과 안정성 세상의 자동차의 운전법이 모두 다르다면 운전하기 전에 운전 방법을 계속 배워야 합니다. 이처럼 일시적으로 사용되는 인터페이스를 배우는 일은 귀찮은 일입니다. 따라서 운전 방법은 안정적이면서 표준적인 것이 좋습니다. 프로그래밍에서도 최대한 안정적이고 표준적인 API를 선호합니다. 하지만 좋은 API를 한 번에 설계할 순 없습니다. API 제작자는 이를 계속해서 개선해나가기 원합니다. 보통은 이에대한 해결책으로 버저닝을 통해 관리합니다. 또한 사용자에게 API에 대한 정보를 제공하는 것도 중요합니다. 예를 들어 Experimental 메타 어노테이션을 붙이면 해당 요소가 안정적이지 않다는 것을 알려줍니다. 또한 Deprecated 어노테이션을 활용하여 해당 API를 통해 변경될 것을 미리 알려..
-
27장 - 변화로부터 코드를 보호하려면 추상화를 사용하라Kotlin/Effective Kotlin 요약 2023. 3. 13. 00:01
물 위를 걷는 것과 명세서로 소프트웨어를 개발하는 것은 쉽다. 둘 다 동결되어 있다면.. 함수와 클래스 등의 추상화로 실질적인 코드를 숨기면, 사용자가 세부 사항을 알지 못해도 괜찮다는 장점이 있습니다. 추상화의 다양한 사례 1단계 : 상수 리터럴(매직넘버)은 아무것도 설명하지 않습니다. 이를 상수로 빼어낸다면 훨씬 쉽게 이해할 수 있습니다. //지양 if(text.length < 7) return false //지향 const val MIN_PASSWORD_LENGTH = 7 if(text.length < MIN_PASSWORD_LENGTH) return false 2단계 : 함수 토스트 메시지를 자주 출력해야 한다면 다음과 같은 코드를 작성할 수 있습니다. Toast.makeText(this, mes..
-
26장 - 함수 내부의 추상화 레벨을 통일하라Kotlin/Effective Kotlin 요약 2023. 3. 12. 00:01
추상화란? 컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말합니다. 추상화와 자동차 예시 자동차 내부에서는 엔진, 알터네이터, 서스펜션 등의 여러 가지 요소들이 함께 자동차가 움직일 수 있게 만듭니다. 운전을 할 때 이런 요소들을 실시간으로 이해하고 조정해야 한다면, 자동차 운전은 굉장히 힘들 수 있습니다. 하지만 운전자는 자동차를 조종하는 인터페이스(핸들과 페달 등)를 사용하는 방법만 알면 됩니다. 가솔린 자동차, 천연가스 자동차, 경유 자동차, 전기 자동차 모두 운전 방법이 대부분 같습니다. 자동차가 내부적으로 여러 반도체와 특수한 시스템을 도입해도, 운전자는 상관없이 운전할 수 있습니다. 자동차는 굉장히 잘 만들어진 인터페이스로 굉장히 ..
-
25장 - 공통 모듈을 추출해서 여러 플랫폼에서 재사용하라Kotlin/Effective Kotlin 요약 2023. 3. 8. 00:01
중복을 다루기 기업이 한 플랫폼만을 대상으로 애플리케이션을 만드는 경우는 없습니다. 이때 소스코드를 공유할 수 있다면 큰 이득이 발생할 수 있습니다. 풀스택 개발 코틀린의 굉장한 장점 중 하나는 코틀린이 자바스크립트로 컴파일될 수 있다는 것입니다. 예를 들어 리액트 프레임워크와 코틀린/JS를 함께 사용해서 웹 프런트엔드를 만들 수도 있습니다. 이때 공통 코드, API 엔드포인트 정의, 추상화 등을 재사용할 수 있습니다. 모바일 개발 안드로이드 전용으로 애플리케이션을 만드는 경우가 거의 없습니다. AOS/ IOS를 개별적으로 개발하곤 합니다. IOS의 경우 LLVM을 사용하여 네이티브 코드로 컴파일할 수 있는 코틀린/네이티브를 사용하면 Objective-C 프레임워크로 변환할 수 있습니다. 이렇게 변환하면..
-
24장 - 제네릭 타입과 variance 한정자를 활용하라Kotlin/Effective Kotlin 요약 2023. 3. 7. 00:01
불공변성(invariant)이란? 제네릭 타입으로 만들어지는 타입이 서로 관련성이 없다는 의미입니다. 예를 들어 다음 제네릭들은 서로 어떠한 관련성도 갖지 않습니다. - Cup - Cup - Cup - Cup 공변성(covariant)이란? 어떤 관련성을 원할 경우 out 또는 in이라는 variance 한정자를 붙일 수 있습니다. out은 타입 파라미터를 공변성으로 만듭니다. A가 B의 서브타입일때 Cup가 Cup의 서브타입이라는 의미입니다. in은 반대 의미입니다. 타입 파라미터를 contravariant(반변성)으로 만듭니다. A가 B의 서브타입일때 Cup가 Cup의 슈퍼타입이라는 의미입니다. 코틀린에서 함수와 variance 코틀린 함수 타입의 모든 파라미터 타입은 contravariant입니다...
-
23장 - 타입 파라미터의 섀도잉을 피하라Kotlin/Effective Kotlin 요약 2023. 3. 6. 00:01
섀도잉이란? 다음 코드처럼 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가리키는 경우 섀도잉이라 부릅니다. class Forest(val name: Stirng){ fun addTree(name: String) { //... } } 이런 현상은 클래스 타입 파라미터와 함수 타입 파라미터 사이에서도 발생합니다. 특히 제너릭과 함께 사용되는 경우 다양한 문제가 발생합니다. interface Tree class Birch: Tree class Sqruce: Tree class Forest{ fun addTree(tree: T){ println("adding tree ...") } } fun main() { val forest = Forest() forest.addTree(Birch()) forest.addT..
-
22장 - 일반적인 알고리즘을 구현할 때 제너릭을 사용하라Kotlin/Effective Kotlin 요약 2023. 3. 5. 00:01
제네릭 함수 아규먼트로 함수에 값을 전달할 수 있는 것처럼, 타입 아규먼트를 사용하면 함수에 타입을 전달할 수 있습니다. 이를 제네릭 함수라고 합니다. 대표적으로는 filter 함수가 있으며 타입 파라미터로 T를 갖습니다. 이로 인해 컴파일러가 타입을 조금이라도 더 정확하게 추측할 수 있도록합니다. 또한 IDE도 이를 기반으로 여러 가지 유용한 제안을 해줍니다. 기본적으로 List Set 처럼 구체적인 타입으로 컬렉션을 만들 수 있게 클래스와 인터페이스에 도입된 기능입니다. 제네릭 제한 구체적인 타입의 서브타입만 사용하도록 제한할 수 있습니다. 콜론 뒤에 슈퍼 타입을 설정하여 제한을 거는 예시입니다. 예를 들어 T: Any를 활용하면 nullable이 아닌 모든 타입을 나타냅니다. 예를 들어 T: Ite..
-
21장 - 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라Kotlin/Effective Kotlin 요약 2023. 3. 4. 00:01
프로퍼티 위임이란? property delegate를 사용하는 것을 프로퍼티 위임이라 부릅니다 대표적으로 지연 프로퍼티가 있습니다. lazy 프로퍼티는 이후에 처음 사용하는 요청이 들어올 때 초기화되는 프로퍼티를 의미합니다. 다른 언어에서는 대부분 이를 복잡하게 구현해야 하지만 코틀린에서는 lazy 함수를 활용하는 프로퍼티 위임으로 간단하게 구현할 수 있습니다. 또한 변화가 있을 때 이를 감지하는 observable 패턴을 쉽게 만들 수 있습니다. 예를 들어 목록을 출력하는 리스트 어댑터가 있다면 내부 데이터가 변경될 때마다 변경된 내용을 다시 출력해야 합니다. 이때 observable 델리게이트를 기반으로 간단하게 구현할 수 있습니다. 프로퍼티가 사용될 때 로그를 출력하는 예제 기본적인 구현 방법은 게..