Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

패키지 정의

소스코드의 처음에 package를 이용, 패키지를 정의 할 수 있다.
package my.demo
import java.util.*
// ...

함수 정의

두개의 Int형 매개변수를 가지고, Int 값을 반환하는 함수다.
fun sum(a: Int, b: Int) {
    return a + b
}
아래와 같이 단순화 할 수도 있다.
fun sum(a: Int, b: Int)= a+b
함수는 반환 값을 가지지 않을 수도 있다.
fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}
Go 같은 언어들은 에러를 반환하기도 하지만, 코틀린은 그냥 무시하고 실행된다. 실행되기는 하지만 좋은 코드는 아니다.
sum of -1 and 8 is 7

지역 변수

val은 읽기 전용이다.
val a: Int = 1  // 즉시 할당 
val b = 2       // Int로 타입 추론
val c: Int      // 나중에 값을 할당 하 ㄹ수도 있다. 
c = 3
쓰기 전용 이므로 재 할당 할 경우 컴파일 실패한다.

var는 쓰기가 가능한 변수다.
var x = 5
x += 1

String 템플리트

var a = 1
// simple name in template:
val s1 = "a is $a" 

a = 2
// arbitrary expression in template:
val s2 = "${s1.replace("is", "was")}, but now is $a"

null 검사

NullPointException은 프로그램 실행 중 발생하는 가장 흔한 오류 중 하나일 것이다. 가장 흔하면서, 프로그램 자체를 종료 시킬 수 있는 중요한 오류임에도, 전적으로 프로그래머가 책임져야 하는 부담이 있다. 코틀린은 null을 허용하지 않거나, null을 쓰더라도 안전하게 사용 할 수 있게 하고 있다.

코틀린에서 변수는 NotNullNullable을 설정 할 수 있다. 일반적인 변수는 Null을 할당 할 수 없다. 아래 코드를 보자.
var temp: String = "abc"
temp = null
컴파일 하면 "Kotlin: Null can not be a value of a non-null type String" 에러가 발생한다. null을 허용하고 싶다면, ?표를 이용해야 한다.
var temp: String? ="abc"
temp = null

자동 타입변환

is연산자를 이용해서 타입(type)을 체크하고, 캐스팅까지 해준다.
fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        // if 문 안에서 obj는 자동으로 String으로 캐스팅된다.
        return obj.length
    }

    // if 문 바깥에서는 여전히 Any 타입이다. 
    return null
}
아래와 같이 나타낼 수도 있다.
fun getStringLength(obj: Any): Int? {
    if (obj !is String) return null

    // obj는 자동으로 String로 캐스팅 된다.
    return obj.length
}

for 루프문

fun main(args: Array<String>) {
    val items = listOf("apple", "banana", "kiwi")
    for (item in items) {
        println(item)
    }
}
혹은
val items = listOf("apple", "banana", "kiwi")
for (index in items.indices) {
    println("item at $index is ${items[index]}")
}

While 루프문

val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
}

when

fun describe(obj: Any): String =
when (obj) {
    1          -> "One"
    "Hello"    -> "Greeting"
    is Long    -> "Long"
    !is String -> "Not a string"
    else       -> "Unknown"
}

range

for (x in 1..5) {
    print(x)
}
스텝 설정
for (x in 1..10 step 2) {
    print(x)
}
for (x in 9 downTo 0 step 3) {
    print(x)
}

Collections

fun main(args: Array<String>) {
    val items = listOf("apple", "banana", "kiwi")
    for (item in items) {
        println(item)
    }
}

fun main(args: Array<String>) {
    val items = setOf("apple", "banana", "kiwi")
    when {
        "orange" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }
}

참고