🚫예외를 활용해 코드에 제한을 걸어라.. 이번 안정성 챕터에서는 이전에서도 보았듯이 예상치 못한 동작을 막고 앱의 안정성을 높이는 방법을 코드에 여러 제한을 걸어 앱이 예상치 못한 동작을 하지 못하도록 막는 방법과 이렇게 막을 경우 얻는 여러 장점들에 대해서 얘기합니다. 방법 1. 아규먼트(argument) require 블록: 아규먼트에 제한할 수 있음 require함수 같은 경우 값이 참인지 체크하고 거짓일 경우 IllegalArgumentException을 throw 시킵니다. 이와 비슷하게 requireNotNull함수가 존재하는데 값이 Null일 경우 IllegalArgumentException을 throw 시킵니다. public inline fun require(value: Boolean): ..
오늘은 함수들을 열어보다 처음 보는 예약어를 발견했습니다. contract { returns() implies value } 그렇기에 오늘은 이 예약어들을 알아볼까 합니다. Contract의 기능 fun String?.isNotNull(): Boolean = this != null fun foo(s: String?) { if (s != null) s.length if (s.isNotNull()) s?.length // No smartcast :( } 공식문서에서는 contact가 기존의 스마트케스팅을 할 때 해당 스코프를 나가게 될 경우 스마트 캐스팅이 되지 않았던 점이 있었습니다. 그래서 코틀린은 1.3 버전부터 해당기능을 지원하는 contract 함수를 이용할 수 있게 되었습니다. 이 함수의 장점은 ..
책에서는 타입추론(type interference)으로 리턴하지 말라합니다. 잠시 타입추론을 설명하자면.. val name = "John" // 변수 name은 String 타입으로 추론됨 val age = 25 // 변수 age는 Int 타입으로 추론됨 fun calculateSum(a: Int, b: Int): Int { return a + b } val result = calculateSum(5, 10) // 변수 result는 Int 타입으로 추론됨 위 코드처럼 코틀린은 타입을 지정하지 않아도 위의 코드처럼 처음 초기화될 때의 값에 따라 타입추론 하여 해당 변수나 상수의 타입을 지정해 줍니다. 이러다 보니 해당값에 착가하고 다른 것을 넣게 될 경우 당연히 Type mismatch오류가 발생합니다...
코틀린은 자바를 기반으로 만들어졌기 때문에 자바로 만든 코드들은 코틀린에서도 사용할 수 있게 됩니다. 그러다 보니 그 과정에서 어노테이션으로 nullable이 지정되지 않은 타입 즉 플랫폼 타입들을 쓰게 될 경우 코틀린에서는 매번 널 관련된 검사를 해야 합니다. 그렇지 않는다면 해당 부분을 사용할 때 NPE가 발생할 수도 있는 위험을 감수해야 합니다. 그렇기 때문에 이 책에서는 이러한 nullable이 지정되지 않은 플랫폼 타입을 사용을 자제하라고 말합니다. // 자바 public class UserRepo{ public List getUsers() { //... } } 위처럼 자바의 경우 NotNull 이필수가아닙니다. 자바에는 여러 자료형이 있고 어떤 자료형에서는 null을 허용하기도 하고 막기도 합..
오늘을 코틀린의 시퀀스(Sequence)를 알아볼까 합니다. 시퀀스 한국말로 해석하면 수열입니다. 수열은 수가 나열된 것을 말합니다. 코틀린에서도 이와 비슷하게 리스트처럼 수들을 가지고 있을 수 있습니다. 그렇다면 코틀린은 리스트도 있는데 왜 시퀀스를 만들었을까요. 그것은 시퀀스만의 장점이 있기 때문입니다. 시퀀스의 특징에 대한 설명에 앞서 하나의 코드를 보여주겠습니다. //1번 val list = "it is a test code".split(" ") val conversionList = list.filter { it.length > 1 }.map { "[$it]" }.take(2) println(conversionList.joinToString(" "))//[it] [is] println() //2번..
언어마다 필수적으로 리스트나 맵 셋 같은 자료형들을 모아놓은 자료구조들을 지원합니다. 이러한 용소들은 대부분의 언어에서 필수적입니다. 오늘은 그 많은 자료구조 중 Kotlin의 Collection을 알아볼까 합니다. 구조로는 기본적으로 mutable이 붙지 않은 List, Set, Map과 Mutable이 붙은 MutableList, MutableSet, MutableMap이 있습니다. 기본적인 이 List나 Set,Map같은 경우에는 한번 정의하게 되면 값을 추가하거나 삭제할 수 없습니다. 그렇지만 MutableCollection과 List,Set,Map을 상속받은 MutableList, MutableSet, MutableMap 같은 경우 중간에 값을 추가할 수 있습니다. val list = listO..
변수의 스코프를 최소화시켜야 하는 이유 책에서는 변수의 스코프를 최소화하라고 합니다. 예시를 봐봅시다. fun main(){ val a = 1 val b = 2 val c = 3 fun fizz() { println(a+b) } fun buzz() { println(a+c) } } 이예시에서는 b와 c는 fizz와 buzz에서 밖에 쓰이지 않습니다. 그렇다면 b와 c를 fizz와 buzz안에 넣으면 어떻게 될까요? fun main(){ val a = 1 fun fizz() { val b = 2 println(a+b) } fun buzz() { val c = 3 println(a+c) } } 이렇게 넣게 되면 b나 c라는 변수를 추적하거나 함수의 스코프 밖에서는 해당 변수를 사용할 수 없습니다. 이러한 부..
- 시작하며 - 만약 잘 넘어지는 아이가 뛰어놀고 있다면 가장 간단하게 넘어져 다치지 않게 만들 수 있는 방법이 무엇일까요? 저는 우선 아이를 우선 멈춰 새 울 것 같습니다. 멈춰 새운다면 돌아다니지 않으니 다치지 않을 것입니다. 코드도 이와 비슷한 점이 있습니다. 첫 Chapter인 안정성에서는 안정성이 있는 코드를 짜서 잠재적 오류를 배제하라고 합니다. 코드 또한 안전하게 만들기 위해서는 가장 간단하게 가변성을 제한한다면 예측가능한 상황으로 만들 수 있을 것입니다. - 본문 - 코틀린의 요소 중 일부는 var 또는 mutable을 사용하여 상태를 가질 수 있습니다. 이 요소가 작다면 예측가능한 패턴만 있겠지만 그 수가 많다면 생길 수 있는 패턴이 기하급수적으로 늘어날 것입니다. 패턴이 많으면 무슨 문..
- 시작하며 - 프로젝트를 하다 보면 예전에 만들었던 코드들과 현재코드를 비교했을 때 통일성이 없을 때가 많습니다. 대부분 그 이유는 변수나 함수를 만들 때 따로 규칙 없이 생각나는 대로 이름을 정한다든가 비슷한 규칙을 다르게 표현하면 코드가 통일성이 없고 이해하기도 힘들어지니 유지보수하기도 어려워집니다. 이런 통일성 없는 코드들을 예방하기 위해서는 클린코드 규칙을 정하고 그 규칙을 따르며 코드들을 짜야합니다. - 본문 - Java 같은경우 클린코드규칙들을 정리한 Effective Java라는 책이 있습니다. Java를 바탕으로 나온 Kotlin 또한 Effectiv Kotlin이라는 클린코드규칙들을 정리한 책이 있습니다. 이 책 같은 경우 안전성, 가독성등 52가지 주제를 가지고 클린코드를 짜기 위한 ..