본문 바로가기
프로그래밍 놀이터/Kotlin, Coroutine

[Kotlin Tutorial] Kotlin 소개 - Kotlin : what and why

by 돼지왕 왕돼지 2017. 7. 12.
반응형

 [Kotlin Tutorial] Kotlin 소개 - Kotlin : what and why


참조 : Kotlin in Action


.kt, ?, A Taste of Kotlin, Abstraction, Android, android studio, anko, anko lib, annotation, ant, anywhere Java runs, Apache License 2, apk size, boilerplate, Builder 패턴, classcastexception, code completion, Collection 류에서 functional style 을 사용할 수 있게 API 가 뚫려있다., community edition, compile time, Compiler, Compiling Kotlin code, concise, CONTEXT, debug, Domain-specific language, DSL, dynamically typed, eclipse, Example, extend, extension, First-class functions, fp, Free and open source, function type, Functional, Functional and object-oriented, General-purpose language, github, GPL, gradle, IDE, Immutability, Immutable data class, imperative, implement, inline, Intellij, IntelliJ IDEA Community Edition, interact, Interactive shell, Interoperable, Java, Java-to-Kotlin converter, JAVA6, javafx, javascript, JSON API app, Kotlin, Kotlin : what and why, Kotlin on Android, Kotlin runtime library, kotlin tutorial, kotlin 강좌, kotlin 소개, kotlin 확장자, Kotlin's Primary Traits, kotlinc, kt, LAMBDA, Lambda expression, Library, Logo, Maintainability, marketplace, Mathematica, matlab, maven, Mini language, Multi-OS Engine, multithreading 에 safe, navigate, No side effects, NPE, nullable type, NullPointerException, Object-Oriented, Online playground, OOP, OpenGL Shading, opera source, operator overloading, Performance, Plug-in for IntelliJ IDEA and Android Studio, plug-in manager, Pragmatic, refactoring, Reliability, REPL, RPC Protocol, Runtime, Runtime 에러, safe, sample, server0side, Service, SQL, static typing, Static typing 의 장점, Statically typed, syntax, Target platforms: server-side, template language, Testing, The Philosophy of Kotlin, Tool, Tool support, TornadoFX, try.kotl.in, type, Type check 와 converting 이 한 operation, type inference, type 추론, Using the Kotlin tools, verilog, VHDL, Web App, [Kotlin Tutorial] Kotlin 소개, 간결, 동적 타입, 무료, 새로운 operator 정의는 불가능, 실용적, 예제, 정적 타입, 축약, 코드 중복


-

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>



-

.kt, ?, A Taste of Kotlin, Abstraction, Android, android studio, anko, anko lib, annotation, ant, anywhere Java runs, Apache License 2, apk size, boilerplate, Builder 패턴, classcastexception, code completion, Collection 류에서 functional style 을 사용할 수 있게 API 가 뚫려있다., community edition, compile time, Compiler, Compiling Kotlin code, concise, CONTEXT, debug, Domain-specific language, DSL, dynamically typed, eclipse, Example, extend, extension, First-class functions, fp, Free and open source, function type, Functional, Functional and object-oriented, General-purpose language, github, GPL, gradle, IDE, Immutability, Immutable data class, imperative, implement, inline, Intellij, IntelliJ IDEA Community Edition, interact, Interactive shell, Interoperable, Java, Java-to-Kotlin converter, JAVA6, javafx, javascript, JSON API app, Kotlin, Kotlin : what and why, Kotlin on Android, Kotlin runtime library, kotlin tutorial, kotlin 강좌, kotlin 소개, kotlin 확장자, Kotlin's Primary Traits, kotlinc, kt, LAMBDA, Lambda expression, Library, Logo, Maintainability, marketplace, Mathematica, matlab, maven, Mini language, Multi-OS Engine, multithreading 에 safe, navigate, No side effects, NPE, nullable type, NullPointerException, Object-Oriented, Online playground, OOP, OpenGL Shading, opera source, operator overloading, Performance, Plug-in for IntelliJ IDEA and Android Studio, plug-in manager, Pragmatic, refactoring, Reliability, REPL, RPC Protocol, Runtime, Runtime 에러, safe, sample, server0side, Service, SQL, static typing, Static typing 의 장점, Statically typed, syntax, Target platforms: server-side, template language, Testing, The Philosophy of Kotlin, Tool, Tool support, TornadoFX, try.kotl.in, type, Type check 와 converting 이 한 operation, type inference, type 추론, Using the Kotlin tools, verilog, VHDL, Web App, [Kotlin Tutorial] Kotlin 소개, 간결, 동적 타입, 무료, 새로운 operator 정의는 불가능, 실용적, 예제, 정적 타입, 축약, 코드 중복

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 같은 일반적인 에러도 잘 예방해준다.

훨씬 짧게 코드를 짤 수 있고, 가독성이 더 좋아질 수 있다. 





반응형

댓글