Chapter 1. Kotlin : what and why
- 자바 플랫폼을 대상으로 하는 새로운 프로그래밍 언어.
- concise, safe, pragmatic, 자바 코드와 상호 호환 됨.
- 자바가 사용되는 거의 모든 곳에 쓸수 있음 : server-side, Android App…
- 기존에 존재하는 자바 라이브러리, 프레임웍에서 잘 동작하고 자바와 동일한 성능으로 실행됨.
1.1 A Taste of Kotlin
- http://try.kotl.in : 코틀린 코드 실행 가능한 페이지
// "data" class
data class Person(val name: String,
val age: Int? = null) // Nullable type(Int?)
// top-level function
fun main(args: Array<String>) {
val persons = listOf(Person("Alice"), Person("Bob", age = 29),
Person("Tom", 35), Person("Kkumot", 18))
val oldset = persons.maxBy { it.age ?: 0 } // Lambda expression, Elvis operator
println("The oldset is: $oldset") // string template
}
// The oldset is: Person(name=Tom, age=35) <-- autogenerated toString
1.2 주요 특징
1.2.1 어디에 쓰나?
- server-side 코드
- 안드로이드 Application
- Intel Multi-OS Engine1을 사용하면 iOS도 개발 가능
- JavaScript도 지원 예정
1.2.2 Statically typed
- Java와 동일하게 statically typed(<->Dynamically typed) 언어이다.
- 하지만, 자바처럼 모든 변수에 명시적으로 타입을 지정할 필요는 없다.
val x = 1
- 위와 같이 선언하는 경우 자동적으로 Int 타입으로 결정된다.
- 타입 추론(type inference) : Context에서 타입을 결정하는 컴파일러의 기능
- Benefits of static typeing:
- Performance : 런타임에 어떤 메소드를 호출해야하는지 결정할 필요가 없으므로 빠르다.
- Reliability : 컴파일시에 에러가 검출되므로, 런타임에 에러가 발생할 기회가 더 적다.
- Maintainability : 익숙하지 않은 코드를 개발할 때, 어떤 객체의 코드가 동작하는지 확인 할 수 있으므로 더 쉽다.
- Tool support : 신뢰할수 있는 리펙토링, 정밀한 코드 완성도 및 다른 IDE 기능들을 사용할 수 있다.(동적 타입 언어는 못하나..?)
- 타입 추론으로 정적 타입이 가지는 장황한 대부분의 것들이 없어졌다.
- Class, Interface, Generic등 자바와 매우 유사한 컨셉들이 있다.
1.2.3 Functional and object-oriented
자바 개발자는 OOP에는 익숙하나, functional programing에는 익숙하지 않을 수 있다. 주요 컨셉은 아래와 같다.
- First-class function : 함수를 values로 사용. 변수에 저장하거나, 파라메터로 넘기거나, 리턴타입으로 사용가능
- Immutablility : 불변 격체를 사용.
- No side effects : 동일한 input에 대해 동일한 return을 가지며, 다른 객체를 수정하거나 외부와 상호작용하지 않는 함수를 사용.
함수형 스타일로 얻는 이점?
- Conciseness
- 함수를 값으로 사용하면 추상화가 더 강력해지므로 코드가 더 간결해 질 수 있다.
- Safe Multithreading
- immutable data와 pure function으로 적절한 동기화 없이 멀티쓰레드 환경에서 일어나는 동일 데이터에 대에 신경쓰지 않아도 된다.
- 테스트하기 쉽다. side effects 없는 functions은 많은 셋업 코드와 테스트 환경을 위한 구성에 의존하지 않고 테스트 가능하다.
fun findAlice() = findPerson { it.name == "Alice" }
fun findBob() = findPerson { it.name == "Bob" }
일반적으로 대부분의 프로그래밍 언어는 함수형 스타일로 사용할 수 있다. 코틀린은 아래의 함수형 스타일을 지원하기 위해 아래 기능을 지원한다.
- Function Types : 함수를 parameter/return 타입으로 사용할 수 있다.
- Lambda expression : 람다 표현식을 사용하여 코드 블럭을 넘길 수 있다.
- Data classes : immutable objects 생성을 위한 간결한 문법을 제공한다.
- 표준 라이브러리에 함수형 스타일의 객체와 컬렉션 작업을 위한 풍부한 API 셋이 있다.
함수형 프로그래밍을 강요하지는 않는다. 기존 스타일대로 코딩을 해도 된다. 알아서 잘 적절하게 사용해라.
1.2.4 Free and open source
컴파일러, 라이브러리, 관련된 툴 모두다 오픈소스다.(Apache 2) IntelliJ, Android Studio, Eclipse를 지원한다.
1.3 Kotlin Applications
- 서버사이드, 안드로이드 개발에 사용할 수 있다.
1.3.1 Kotlin on the server side
- 웹 어플리케이션, 모바일 어플리케이션의 backends, Microservices
- 기존 자바 코드와 완벽히 호환된다.
- HTML generation library이나 Exposed framework와 같은 깨끗하고 간결한 DSL로(을) 개발할 수 있다.
1.3.2 Kotlin on Android
- Anko Library : 안드로이드 개발을 더 빠르고 쉽게 하기위해코틀린 팀에서 만든 라이브러리
- NPE에서 보다 더 안전하다. “Progress Has Stopped” dialog를 덜 보게 된다.
- JAVA와 완벽하게 호환된다. (사용자가 안드로이드를 업그레이드 하지 않아도 코틀린의 새로운 기능을 쓸수 있다.)
- 성능상 불리한 점도 없다.
- 컴파일 후 어플리케이션 사이즈가 크게 증가하지도 않는다.
- 람다와 코틀린의 표준 라이브러리 함수들은 인라인 처리 된다.
- 인라인 처리된 람다는 새로운 오브젝트를 생성하지 않고, GC pauses를 겪지 않아도 된다.
1.4 The Philosophy of Kotlin
- pragmatic, concise, safe, interopeable
1.4.1 Pragmatic
- 실용적이다. 암튼, 실용적이다.
- research language가 아니다. 그런건 computer science나 줘버려라.
- 특정 프로그래밍 스타일, 패러다임을 강요하지 않는다.
- IntelliJ 라는 훌륭한 툴이 있다. 이것만으로도 실용적이다.
1.4.2 Concise
- 새로운 코드를 작성하는 시간보다 다른 사람(또는 오래전에 내가 작성했던)의 코드를 읽는 시간이 더 많다.
- 간단하고 간결한 코드는 더 빠르게 코드를 읽을 수 있게 한다.
- 코틀린은 작성되는 모든 코드가 의미를 담도록 노력했다.
- getter, setter, constructor의 파라메터 필드 할당 등의 잡다한 코드를 제거했다.
- 람다를 쓸 수 있다.
- 그렇다고 함수 등의 문자수를 막 줄이지는 않았다. 단어가 더 읽기 쉽다.
1.4.3 Safe
- 안전한 언어 : 프로그램의 오류를 방지하기 위한 설계.
- 모든 에러를 방지할 수는 없다. 컴파일러에게 적절한 정보를 줘야 한다.
- Java 보다 안전한 언어를 만들기 위해 노력했다.
- JVM에는 이미 많은 안전장치들이 있다.
- 모든 타입을 명시하지 않아도, 많은 케이스에 컴파일러가 자동적으로 타입을 추론한다.
- 런타임이 아닌 컴파일타임에 더 많은 오류를 체크한다.
- NPE을 제거하기 위해 노력한다.(최소한의 비용으로..)
- nullable data를 다루기 위해 많은 편한 방법을 제공한다.
- ClassCastException도 피할 수 있다.
if (value is String) // 여기서 타입을 체크하면
println(value.toUpperCase()) // 따로 캐스팅 하지 않아도 된다.
1.4.4 Interoperable
- “기존 라이브러리를 쓸 수 있나요??” “Yes, absolutely.”
- 자바 메소드를 호출하고, 클래스를 상속하고, 인터페이스를 구한할 수 있다.
- 자바 annotation을 코틀린 클래스에 쓸 수 있다.
- 한 프로젝트에서 자바 코드와 코틀린 코드를 함께 쓸 수 있다.
- 코틀린은 기존 자바 라이브러리를 가능한 많이 사용하고 있다.
- 코틀린의 컬렉션은 자바의 컬렉션 라이브러리이다.
- 사용하기 좀 더 편하도록 함수를 추가했다.
- IDE에서도 java, kotlin 관계없이 Navigate, Debug, Refactor할 수 있다.
1.5 Using the kotlin tools
- 환경설정은 여기를 참고하자.
1.5.1 Compiling Kotlin code
1.5.2 Plug-in for Intellij IDEA and Android Studio
- 플러그인이 있다.
- 최신 버전에는 포함되어 있다.
1.5.3 Interactive shell
- REPL(Read Eval Print Loop)로 코틀린 코드를 한 줄씩 실행해 볼 수 있다.
- 인자 없이 kotlinc 명령어를 사용하거나, 플러그인에서 해당 메뉴를 선택해라.
1.5.4 Eclipse plug-in
- 이클립스 플로그인도 있다. Marketplace에서 검색해라.
1.5.5 Online playground
- 여기에서 온라인으로 코틀린 코드를 작성하고 실행해 볼 수 있다.
1.5.6 Java-to-Kotlin converter
- java 코드를 쉽게 kotlin 코드로 변경할 수 있다.
- Intellij, Android Studio, Eclipse, Online 다 가능하다.
1장 끝.