오늘은 함수들을 열어보다 처음 보는 예약어를 발견했습니다. 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을 사용하여 상태를 가질 수 있습니다. 이 요소가 작다면 예측가능한 패턴만 있겠지만 그 수가 많다면 생길 수 있는 패턴이 기하급수적으로 늘어날 것입니다. 패턴이 많으면 무슨 문..
플루터를 공부하려고 여러사이트 들을 들어가니니 Widget이나 Element,RenderObject 있었습니다. 그렇다면 그특징은 무었이고 또 차이는 무었일까요? Widget Widget은 Flutter에서 UI를 구축하기 위한 기본적인 구성 요소입니다. Widget은 화면에 무엇을 그릴지에 대한 정보를 가지고 있으며, 재사용 가능하고 조합 가능한 조각들로 구성됩니다. Widget은 불변(immutable)하며, 한 번 정의된 후에는 변경되지 않습니다. Widget은 특정한 구조, 레이아웃, 스타일, 상태 및 상호작용을 정의할 수 있습니다. Widget은 화면에 렌더링될 때 Element로 변환됩니다. => 프레임워크의 공개 API 또는 청사진입니다. 개발자는 일반적으로 위젯 구성만 처리합니다. Elem..
- 시작하며 - Flutter는 구글에서 개발한 오픈 소스 프레임워크로, 모바일 애플리케이션 개발을 위한 툴킷입니다. 플러터는 크로스 플랫폼 개발을 지원합니다. 다른 크로스 플랫폼 개발을 지원하는 React Native가 있지만 성능면에서는 자바 스크립트를 사용하는 React Native에 비해 성능 면에서 뛰어납니다. 그렇다면 왜 Flutter가 성능면에서 native앱과 비교했을 때 차이가 거의 없는지에 대해 그리고 Flutter의 여러 특징들에 대해서 알아볼까 합니다. - 본문 - 컴파일된 언어 플러터는 다트(Dart) 언어를 사용하여 개발됩니다. 다트는 JIT(Just-In-Time) 컴파일러와 AOT(Ahead-Of-Time) 컴파일러를 모두 지원합니다. JIT 컴파일러는 개발 시에 핫 리로딩과..
- 시작하며 - 프로젝트를 하다 보면 예전에 만들었던 코드들과 현재코드를 비교했을 때 통일성이 없을 때가 많습니다. 대부분 그 이유는 변수나 함수를 만들 때 따로 규칙 없이 생각나는 대로 이름을 정한다든가 비슷한 규칙을 다르게 표현하면 코드가 통일성이 없고 이해하기도 힘들어지니 유지보수하기도 어려워집니다. 이런 통일성 없는 코드들을 예방하기 위해서는 클린코드 규칙을 정하고 그 규칙을 따르며 코드들을 짜야합니다. - 본문 - Java 같은경우 클린코드규칙들을 정리한 Effective Java라는 책이 있습니다. Java를 바탕으로 나온 Kotlin 또한 Effectiv Kotlin이라는 클린코드규칙들을 정리한 책이 있습니다. 이 책 같은 경우 안전성, 가독성등 52가지 주제를 가지고 클린코드를 짜기 위한 ..