기본 콘텐츠로 건너뛰기

Kotlin Grammar

Kotlin is a programming language developed by Jetbrain.
It was first published in 2011, but Kotlin has got the fame very slowly.
The most significant factor in Kotlin, I think, is that it can deal with null exception safely.


Using Kotlin in Android Studio

Install Kotlin Plugins

  • Ctrl + Shift + A.
  • Put ‘convert java file to kotlin’.
  • Ctrl + Shift + A again.
  • Put ‘sync project with gradle files’
  • Click ‘configure’ in upper right side of the screen.
  • Click OK.

Basis

Variable Declaration

val, var

  • val : constant // It may mean VALue or VAriable Literal I think…
  • var : variable

data type

  • with colon
    • val age : Int = 25

etc

  • And it doesn’t use semi colons.

Functions

basic format

fun add(a: Int, b: Int): Int {
    return a + b
}

simple format

fun add(a: Int, b: Int): Int = a + b
fun max(a: Int, b: Int): Int = if (a > b) a else b

Null Safety

? (nullable)

  • In default, Kotlin doesn’t permit to put null into variables.
  • If we encounter a case that we have to use null, then we can use nullable signature which is written as ‘?’.
var a: Int = 15
a = null        // error!
var b: Int? = 15
b = null        // It works.

?. (safe calls)

  • It calls the member or the method only when the object is not null
fun getSize(targetStr: String?): Int? {
    return targetStr?.length    // If targetStr is null, targetStr?.length returns null.
}
  • It simplifies code like this
if(aaa != null && bbb != null && ccc != null) {
    return aaa.bbb.ccc.name;
}
return null;

into

return aaa?.bbb?.ccc?.name

Any & is

Any

  • It’s same with Object in Java.

is

  • It’s same with instanceof in Java.

usage example

fun getStringLength(obj: Any): Int? {
    if(obj is String) {
        return obj.length
    }
    return null
}

when

  • example
fun main(args: Array<String>) {
    cases(2)
    cases(4)
}

fun cases(obj: Any) {
    when(obj) {
        1 -> println("white balloon flower")
        2 -> println("circular record")
        3 -> println("blue water parsely")
        4 -> println("pretty blue bird")
    }
}
  • execution result

circular record
pretty blue bird

ranges

usage in loop

for (x in 1..10) {  // 1 <= x <= 10
    println(x)
}

usage in if (with ‘in’)

val array = arrayList<String>
array.add("aaa")
array.add("bbb")

val x = 3

if(x !in 0..array.size - 1) {
    println("Out: array size is ${array.size}, but you requested x = ${x}")

Idioms

Class

getters and setters

  • Unlike Java, no need to make them.
  • example
var sample: Sample = Sample("Name", "a@a.c")
println(sample.name)
println(sample.email)

Data Class

It is the class that is just holding data, without any methods.

format

data class User(val name: String, val age: Int)

requirements

  • The primary constructor needs to have at least one parameter.
  • The parameters should be marked as ‘var’ or ‘val’.
  • Data classes cannot be abstract, open(public), sealed(private) or inner

built-in functions

  • equals(), hashCode()
  • toString()
    • It returns like this : “User(name=John, age=42)”
  • componentN() // I don’t know what it is :)
  • copy()
    • This method can be used when we need to copy an object with changing only some of its property.
    • example
val jack = User(name="Jack", age=1)
val olderJack = jack.copy(age=2)

Lambdas

definition and features

  • definition
    • A “function literal” or an “anonymous function”
  • features
    • Its parameters are declared before ->, and the body goes after ->.
    • A lambda expression is always surrounded by curly braces({ }).
      ex) {a, b -> a.length < b.length}

example

  • Java code
button.setOnClickListener {
    public void onClick(View view) {
        view.setAlpha(0.5f);
    }
}
  • Java lambda code
button.setOnClickListener {
    view -> view.setAlpha(0.5f);
}
  • Kotlin lambda code (original grammar)
button.setOnClickListener {
    view -> view.setAlpha(0.5f)
}
  • Kotlin lambda code (modified grammar (it))
    • We can use ‘it’ only if the number of parameters is 1.
button.setOnClickListener {
    it.alpha = 0.5f
}
// it = 그 메소드에 파라미터로 넘긴 그거 (IT that is given to the method as a parameter)

Filters

filter

  • Java code
for (Integer intger : list) {
    if(integer < 10) {
        integer *= 2;
    }
  • Kotlin code
list.filter { it < 10 }.map { it *= 2 }

filterNotNull

val listWithNull = List<Int?> = listOf(1, 2, null, 3, 4, 5)
val listWithoutNull = listWithNull.filterNotNull()
listWithoutNull.map{ 
    Log.d("TAG", "NotNULL it " + it) 
}

filterNot

val listWithNull = List<Int?> = listOf(1, 2, null, 3, 4, 5)
listWithNull.filterNot{ it == null }.map {
    Log.d("TAG", "NotNULL it " + it) 
}

String Interpolation

$variableName

val a: String = "name"
val b: String = "Sejin"
Log.d("TAG", "$a: $b") 

Data Structure Declaration (~Of)

arrayOf

var numbers: Int = intArrayOf(1, 2, 3, 4, 5)

listOf

val list = listOf("a", "b", "c")

mapOf

It uses keyword ‘to’.

val map = mapOf("A" to 1, "B" to 2, "C" to 3)

Infix Notation

It’s a magic T_T…

fun Int.multiply(x: Int): Int {
    return this * x
}

The code above is adding a new method ‘multiply(x: Int): Int’ to ‘Int’ class.
So from now on, we can use multiply method like below.

val mulResult = 3.multiply(10)

In addition, we can use this multiply into inflix notation form.

val mulResult = 3 multiply 10



I mainly refered to here.

댓글

이 블로그의 인기 게시물

Kotlin + NDK, OpenCV

원래 이 블로그는 영어로만 작성하려고 했었으나, 코틀린 프로젝트에서 OpenCV를 사용하는 방법에 대해 정리한 한글 블로그가 거의 없어서 이 참에 블로그 방문자 유입도 좀 늘릴 겸하여 이번 포스트는 한글로 작성하려고 한다. 절대 영어로 쓰기 귀찮아서 한글로 쓰는 게 아니다. 내가 좀 쫄보여서 그런지는 몰라도 간단한 테스트도 iterative하게 진행하는 게 마음이 편하다. 그래서 1. Kotlin 2. Java + NDK(C++) 3. Kotlin + NDK(C++) 4. Java + NDK(C++) + JNI + OpenCV 5. Kotlin + NDK(C++) + JNI + OpenCV 순으로 프로젝트를 생성하여 한 단계씩 통과시켜가며 넘어갈 생각이다. 그런데 결론부터 말하자면, OpenCV에서 Kotlin을 지원하지 않는 것으로 보인다. OpenCV의 라이브러리 폴더(OpenCV-android-sdk\sdk\native\libs\mips64)를 열어보면 libopencv_java3.so 파일은 찾을 수 있지만 libopencv_kotlin 비슷한 이름을 가진 파일은 없다. Kotlin에서 C++을 돌려봤다는 사실 정도에 만족하고 넘어가도록 하자… ㅠㅠ 환경 다음의 환경에서 진행한다. * Android Studio 2.3 * OpenCV 3.3.0 Kotlin Project 생성 먼저 안드로이드 스튜디오에서 간단한 hello world 자바코드를 생성하여 코틀린코드로 변환해보자. 그냥 처음부터 코틀린으로 만들면 되지 왜 굳이 자바코드를 변환하고 앉아있느냐 할 수도 있는데 안드로이드 스튜디오 2.3에서는 그런 기능을 제공하지 않는다. ㅠㅠ 3.0부터는 아예 코틀린이 안드로이드 스튜디오에 빌트인으로 제공되면서 처음부터 코틀린 프로젝트를 만들 수 있게 된다 카더라. 프로젝트 생성 그냥 자바 기반 안드로이드 프로젝트를 만들면 된다. 어플리케이션명을 적당히 정해주자. Company Domain은 소속된 회사이

Running Anaconda Python on Jupyter Notebook with Docker in Windows

I think there is no IDE more suitable for studying machine learning or deep learning with Python than Jupyter Notebook. However, it is so difficult to construct a Jupyter environment without crushing with the existing Python environment. So, I decided to make an only-for-deep-learning environment in the Ubuntu Docker container to avoid all annoyance. I will assume that you already installed Docker. Environment Ubuntu 17.04 LTS Anaconda 5.0.0 (containing Python 3.6) Creating Docker Container First of all, we are going to create a Docker container. The world is going better day after day! You can get a Docker image containing Anaconda that someone created and simultaneously make a container with the image you just downloaded just with this one-line command. docker run - it --name jupyter -p 8000:8000 --volume /c/Users/jinai/Dropbox/HaveToLearnToRun/CSE/3_1_MachineLearning/jupyter_workspace:/root/jupyter_workspace continuumio/anaconda3 /bin/bash It’s quite complex. So let m

Cooperation Tools That Support Scrum Development Process

We have to cooperate for our project, and we need to decide which tool to use. One of our mentors recommended 3 cooperation tools which support scrum board function, and suggested we learn about that tools, put into shape, and share them one another. So, to follow his order, I write this post. Scrum - Agile Software Development Process First of all, we should know what the hell the SCRUM is. I referred here  and wiki . In agile software development process, there are 3 elements that consist of it - roles, artifacts, workflow. Roles Product Owner They ponder on what they make. Scrum Master They ponder on how they make. Scrum Team They just make T_T Artifacts Product Backlog It contains general requirements. (I don't sure it is right explanation for product backlog.) User Stories It contains detail requirements. Estimates It contains the order of priority of all requirements(user stories). Workflow Iteration & Incremental Developme