[Kotlin Tutorial] Kotlin 소개 - Kotlin : what and why
참조 : Kotlin in Action
-
Kotlin 은 Java platform 을 targeting 한 새로운 프로그래밍 언어.
Java 코드와 함께 쓰일 수 있다.
Android 개발 뿐만 아니라 Server-side 개발에도 쓰일 수 있다.
-
Java 의 iib, framework 와 함께 쓰일 수 있고, Java 와 비교해 Performance 도 거의 동일하다.
1.1. A Taste of Kotlin
-
http://try.kotl.in 을 통해 코드 실습을 할 수 있다.
-
data class Person(val name: String, val age: Int? = null)
fun main(args: Array<String>){
val persons = listOf(Person(“Alice”), Person(“Bob”, age=29))
val oldest = persons.maxBy{ it.age ?: 0 } // lambda
println(“The oldest is: $oldest”)
}
1.2. Kotlin's Primary Traits
1.2.1. Target platforms: server-side, Android, anywhere Java runs
-
Kotlin 은 더 정확하고, 더 생산성있고, 더 안전한 Java 코드를 대신하는 것을 만드는 것이 목표이다.
-
Multi-OS Engine 이란 녀석을 써서 iOS 에서도 Kotlin 코드를 돌릴 수 있다.
TornadoFX, JavaFX 라는 녀석을 써서 Kotlin 으로 데탑용 앱도 만들 수 있다.
-
Kotlin 은 Java 뿐만 아니라 JavaScript 로도 컴파일 될 수 있다.
다시 말해 브라우저에서 실행 가능한 코드이기도 하단 이야기이다.
( 이 책이 써지는 시점에서는 prototype 단계이며, 다른 platform 제공도 검토하고 있다. )
1.2.2. Statically typed
-
Java 처럼 정적타입을 사용한다.
정적 타입이라 하면 Compile time 에 type 이 결정된다는 것.
(Statically typed 와 Dynamically typed 의 장단 비교는 알아서 찾아봐용)
그러나 Java 와의 차이는 Kotlin 은 type 을 지시하지 않아도 된다.
Context 를 통해 type 추론을 하기 때문이다.
val x = 1 // Int 타입으로 자동 지정한다.
-
Static typing 의 장점
Performance : Runtime 에 type 을 체크할 필요가 없다
Reliability : Compiler 가 verify 를 해주기 때문에 Runtime 에러 가능성이 적다
Maintainability : Java 사용자는 static typing 이 더 친숙하다
Tool support : 신뢰성 있는 Refactoring은 물론 Code completion 을 적용하기에도 더 좋다.
-
Type 에 대해 얘기가 나와서 말인데, Kotlin 은 "nullable type" 을 제공한다. 이 녀석이 아주 중요하다.
이 이야기는 나중에 다루겠다.
또한 "function type” 도 제공한다. 이 녀석도 나중에 본다.
1.2.3. Functional and object-oriented
-
Functional programming 의 key concept 은..
First-class functions : function 을 value 처럼 사용한다. Variable 에 저장할수도, parameter 로 전달할수도, return 할 수도 있다.
Immutability : 한번 create 되면 immutable 하다.
No side effects : 외부세계와 interact 하지 않는다.
-
Functional programming 은 imperative(일반적인 명령형 형태) 보다 훨씬 우아하고, 간단명료하다.
abstraction 을 더 잘 활용할 수 있기 때문이며, 이것은 코드 중복도 줄인다.
두번째 장점은 multithreading 에 safe 하다.
Immutable 이기 때문이다.
마지막으로 testing 하기가 훨씬 쉽다.
No side effects 특성 때문에 외부와 interact 하지 않기 떄문에 별다른 setup 없이 쉽게 테스트 가능하다.
-
물론 Java 에서도 3rd party lib 을 사용하는 등을 통해 functional programming 이 가능하긴 하지만, Kotlin 은 체질적으로 functional programming 을 지원할 수 있다. 다음과 같은 특성 때문이다.
Function type 을 제공하고 있기 때문이며,
Lambda expression 도 제공하고,
Immutable data class 도 제공하고,
Collection 류에서 functional style 을 사용할 수 있게 API 가 뚫려있다.
Kotlin 이 functional programming 을 지원한다고 해서 반드시 써야 하는 것이 아니다.
그러나 쓰면 좋다. 요즘 트렌드자나? ( 트렌드는 장점이 있으니 트렌드겠지?)
1.2.4. Free and open source
-
Language 자체는 물론, compiler, library, tool 등이 전부 open source 이며 공짜이다. 어떤 목적이든간에!!
야호!!! (물론 라이센스는 있다 Apache License 2)
Github 에서 소스를 찾을 수 있다.
-
IntelliJ, Android Studio, Eclipse 등의 IDE 에서 full support 를 한다.
1.3. Kotlin Applications
1.3.1. Kotlin on the server side
-
Server-side 개발이라 하면 정말 많은 범위를 포함한다.
HTML 을 return 하는 Web app
HTTP 기반 JSON API app
RPC Protocol 등을 이용해 다른 service 와 통신하는 service
-
Kotlin 의 특장점 중 하나는 Java code 와 seamless 하게 함께 쓸 수 있다는 것.
Java class 를 extend 할 수도 있고, java 것을 annotate 할 수도 있고 그렇다.
-
Kotlin 은 Builder 패턴도 지원한다.
-
HTML 을 작성할 때 template language 를 사용 안 해도 된다!!
fun renderPersonList(persons: Collection<Person>) =
createHTML().table{
for ( person in persons ){
tr{
td { +person.name }
td { +person.age }
}
}
}
-
Kotlin 의 framework 를 사용하면 사용하면 DSL 코드를 쓰기도 쉽다.
object CountryTable : IdTable() {
val name = varchar(“name”, 250).uniqueIndex()
val iso = varcher(“iso”, 2).uniqueIndex()
}
class Country(id: EntryID) : Entry(id) {
var name: String by CountryTable.name
var iso: String by CountryTable.iso
}
val russia = Country.find{
CountryTable.iso.eq(“ru”)
}.first();
-
cf) DSL ( https://en.wikipedia.org/wiki/Domain-specific_language )
Domain-specific language, Mini language 라고도 불린다.
말 그대로 특정 분야에 specific 한 language 를 말하며, 그래서 반대말은 GPL ( General-purpose language ).
DSL 의 대표적인 예는 HTML, Verilog, VHDL(Hardware Description Language), Logo(peril-like drawing), MATLAB, Mathematica, SQL, OpenGL Shading, Gradle 등
DSL 은 세부적으로 DS markup L, DS modeling L, DS programming L 으로 나뉜다.
1.3.2. Kotlin on Android
-
Kotlin team 에서 만든 anko lib 을 사용하면 표준 Android API 보다 훨씬 Kotlin friendly 한 코드를 작성할 수 있다.
// In Activity
verticalLayout{
val name = editText()
button(“Say Hello”){
onClick { toast(“Hello, ${name.text};) }
}
}
-
Kotlin 을 사용하면 NullPointerException( 이하 NPE ) 을 많이 줄일 수 있다.
기존 Java 코드를 Kotlin 으로 compile 하면 NPE 관련해서 컴파일 실패하는 경우가 많이 발생할 것이다.
-
Kotlin 은 Java6 와 완벽히 호환된다.
다시 말해 이전 버전 단말들에서도 Kotlin 으로 작성한 코드가 잘 돈다는 것이다.
-
Kotlin 사용은 Performance 이슈도 없다.
Kotlin 에 의해 사용되는 runtime 은 아주 작다. 그래서 apk 사이즈도 거의 늘지 않는다. ( 늘긴 느나보다. )
Lambda 를 사용하면 대부분 inline 된다.
Lambda inline 은 아시겠지만(?) 사용전까지 new object 를 만들지 않는다. -> GC 덜 발생한다
1.4. The Philosophy of Kotlin
1.4.1. Pragmatic ( 실용적 )
-
많은 feedback 과 사용성 글을 보고 언어를 발전시켰다.
그리고 실험적인 언어가 아니라 이미 성공적으로 사용되고 있는 언어적 특성들만 넣었다.
-
또한 한가지 특성이나 패러다임만 사용하도록 강요하지도 않는다. ( 예를 들면 functional programming 지원한다고 이것만 쓰라고 안 한다 )
-
언어도 중요하지만 Tool 도 개발에 아주 중요한데, Compiler 와 함께 plug-in 등을 함께 출시했다.
새로운 기능은 툴과 함께 release 된다!! (호!!)
1.4.2. Concise ( 간결, 축약 )
-
언어가 concise 하다는 것은 syntax 만으로도 의도를 충분히 표현할 수 있는 경우,
그리고 boilerplate 로 읽는 것을 방해하지 않는 것을 말한다.
-
자주 사용되는 중복되는 기능들은 대부분 API 에 들어가게 했고, lambda 를 사용하면 쉽게 사용할 수 있게 되어 있다.
그래서 코드에는 핵심 로직들만 남을 수 있다.
-
Operator overloading 은 가능하지만, 새로운 operator 정의는 불가능하다.
가급적 함수(words)로 표현하도록 하기 위함이다.
1.4.3. Safe
-
Compiler 에게 에러를 detect 하기 위해서는 더 많은 정보를 코드를 통해 제공해주었어야 했다.
그러나 type inference 가 있기 때문에 compiler 가 더 똑똑하게 error 를 찾아낼 확률이 높아진다.
-
특히나 NPE 에 강하다.
val s: String? = null // may be null
val s2: String = “” // may not be null
-
ClassCastException 에도 강하다.
Type check 와 converting 이 한 operation 으로 된다. ( 나중에 나오지만 SmartCast 라 부른다 )
if (value is String)
println(value.toUpperCase())
1.4.4. Interoperable
-
이미 존재하는 lib 들을 쓰는 데 문제 없다.
Java 함수 호출도 문제 없고, Java class, interface 를 extend 하고 implement 할 수 있다.
Java 의 annotation 도 적용할 수 있다.
-
Java 에서도 Kotlin 코드를 쉽게 부를 수 있다.
Java 코드 쓰듯이 하면 된다.
-
Kotlin 은 Java lib 을 거의 대부분 가져다 쓴다.
그래서 Kotlin 에는 collection lib 이 없다. Java 의 것을 쓰며 확장만 한다.
-
Kotlin tool 은 Java 와 Kotlin 2개의 언어를 동시에 쓰는 것을 잘 지원한다.
Java 와 Kotlin navigate 가 자유롭다.
Debug 에서도 둘이 하나의 코드처럼 작동한다.
한 언어에서의 Refactor 가 연결되어 있다면 Kotlin 코드도 바꾸어준다. (짱!)
1.5. Using the Kotlin tools
1.5.1. Compiling Kotlin code
-
Kotlin 은 .kt 확장자를 갖는다.
그리고 이 녀석이 컴파일되면 .class 파일이 된다.
컴파일러는 kotlinc 이다.
kotlinc <source file or directory> -include-runtime -d <jar name>
Java -jar <jar name>
-
Kotlin 으로 컴파일된 코드는 “Kotlin runtime library” 에 의존성을 갖는다.
이 lib 에는 Kotlin 전용 lib 과 Java 의 것을 extend 한 것이 들어간다.
-
Maven, Gradle, Ant 모두와 호환된다.
1.5.2. Plug-in for IntelliJ IDEA and Android Studio
-
무료인 IntelliJ IDEA Community Edition 은 무료이고, 15 버전부터는 plug-in 같은거 설치도 필요없다.
Android studio 에서는 plug-in manager 를 통해서 plug-in 을 설치하면 된다.
1.5.3. Interactive shell
-
REPL 을 통해서 작은 코드를 바로 테스트 해볼 수 있다.
kotlinc 명령어를 argument 없이 호출하면 수행할 수 있다. ( plug-in 에 들어있다. )
1.5.4. Eclipse plug-in
-
Eclipse Marketplace menu 를 통해 plug-in 을 받으면 된다.
1.5.5. Online playground
-
http://try.kotl.in 을 통해 아무 설치 없이 바로 테스트도 가능하다.
1.5.6. Java-to-Kotlin converter
-
Syntax 가 기억나지 않거나, 알맞게 코딩을 한 것인지 불안할 때 등에 이 converter 를 사용하면 좋다.
좋은 코드라고는 못하겠지만, working 코드인 것만은 맞다.
기존 Java project 에 Kotlin 을 접목시킬 때 유용하게 쓰일 수 있다.
-
Online 으로도 이 녀석이 제공되고, plug-in 에도 이 기능이 있다.
1.6. Summary
-
Kotlin 은 static type, type inference 를 지원하고, 올바르고 빠르고, 간단하게 코드를 작성할 수 있게 해준다.
-
Kotlin 은 oop 와 fp 2가지 스타일 모두를 지원한다.
Fp(functional programming) 를 통해 function 을 객체처럼 다룰 수 있어 훨씬 간단 명료해지며, immutable 이기 때문에 multithreading 환경에서 사용하기 더 쉽다.
-
Server-side app 을 만드는데도 사용될 수 있다.
-
Android 와도 잘 작동한다.
Kotlin friendly lib 도 제공된다.
-
공짜고 open source 이다.
Java 와 잘 호환되며, IDE, Build system 도 다 지원된다.
-
Kotlin 은 실용적이고, 안전하고 간결하며, 호환성이 좋다.
검증된 solution 만 사용하고, NPE 같은 일반적인 에러도 잘 예방해준다.
훨씬 짧게 코드를 짤 수 있고, 가독성이 더 좋아질 수 있다.
'프로그래밍 놀이터 > Kotlin, Coroutine' 카테고리의 다른 글
[Kotlin Tutorial] 함수 정의하고 호출하기 #2 (0) | 2017.08.03 |
---|---|
[Kotlin Tutorial] 함수 정의하고 호출하기 #1 - Chap 3. Defining and calling functions (0) | 2017.08.03 |
[Kotlin Tutorial] Kotlin 기초 #2 - Chap2. Kotlin basics (0) | 2017.07.25 |
[Kotlin Tutorial] Kotlin 기초 #1 - Chap2. Kotlin basics (0) | 2017.07.25 |
[android] Kotlin (코틀린) 이 뭐야? (0) | 2017.07.25 |
댓글