기본 문법

패키지 정의

패키지 정의는 소스 파일의 제일 위에 있어야 합니다.

package my.demo
import java.util.*

// ...

실제 소스 디렉토리와 패키지는 달라도 좋습니다.

Packages를 살펴보세요.

함수 정의

두개의 Int인수를 가지며, Int 값을 반환하는 함수입니다:

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

표현식을 함수 바디로 가지고, 반환형을 추론하는 함수입니다:

fun sum(a: Int, b: Int) = a + b

반환형이 없는 함수입니다:

fun printSum(a: Int, b: Int): Unit {
	print( a + b )
}

Unit 반환형은 생략할 수 있습니다.

fun printSum(a: Int, b: Int) {
	print( a + b )
}

Functions를 살펴보세요.

Defining local variables

한 번만 정의되는 지역 변수(상수, 읽기 전용):

val a: Int = 1
val b = 1 	// 'Int' 형으로 추론
val c: Int	// 값을 선언하지 않을 경우는 타입을 정의해야 함.
c = 1			// 초기값 선언

변수:

var x = 5 // 'Int' 형으로 추론
x += 1

Properties And Fields를 보세요.

주석

자바와 자바스크립트와 마찬가지로, 코틀린은 end-of-line 과 block 주석을 지원합니다.

// This is an end-of-line comment

/* This is a block comment
   on multiple lines. */

자바와의 차이점이라면 코틀린은 block 주석에서 중복 주석을 사용할 수 있습니다.

Java

/* 
/* */ -> 에러 발생
*/

Kotlin

/* 
/* */ -> 에러 없음
*/

주석의 문서화와 관련해서는 Documentating Kotlin Code를 살펴보세요.

템플릿 문자열 사용하기

fun main(args: Array<String>) {
    if (args.size == 0) return

    print("First argument: ${args[0]}")
}

String templates를 살펴보세요.

조건문 사용하기

fun max(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

if를 표현식으로 사용하면:

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

if-expressions를 살펴보세요.

널 체크와 nullable 사용하기

널 값이 들어갈 수 있는 레퍼런스는 반드시 nullable 표기가 있어야 합니다.

str을 integer로 변환할 수 없는 경우 null을 반환:

fun parseInt(str: String): Int? {
    // ...
}

nullable 값을 반환하는 함수를 사용:

fun main(args: Array<String>) {
    if (args.size < 2) {
        print("Two integers expected")
        return
    }

    val x = parseInt(args[0])
    val y = parseInt(args[1])

    // Using `x * y` yields error because they may hold nulls.
    if (x != null && y != null) {
        // x and y are automatically cast to non-nullable after null check
        print(x * y)
    }
}

혹은

    // ...
    if (x == null) {
        print("Wrong number format in '${args[0]}'")
        return
    }
    if (y == null) {
        print("Wrong number format in '${args[1]}'")
        return
    }

    // x and y are automatically cast to non-nullable after null check
    print(x * y) 

Null-safety를 살펴보세요.

타입 체크와 자동 형변환 사용

is 연산자는 표현식이 해당하는 유형의 인스턴스인지 여부를 확인합니다. 변경할 수 없는 지역 변수 또는 속성이 대상 유형임이 확인되면 명시적으로 캐스팅 할 필요가 없습니다:

fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        // `obj`는 이 안에서 자동적으로 `String`으로 캐스팅 됩니다.
        return obj.length
    }

    // 조건문 밖에서 `obj`는 `Any`타입입니다.
    return null
}

혹은

fun getStringLength(obj: Any): Int? {
    if (obj !is String) return null

    // `obj`는 이 경우 자동적으로 `String`으로 캐스팅됩니다.
    return obj.length
}

아니면

fun getStringLength(obj: Any): Int? {
    // `&&`의 오른쪽에서 `obj`는 자동적으로 `String`으로 캐스팅됩니다.
    if (obj is String && obj.length > 0) {
        return obj.length
    }

    return null
}

ClassesType casts를 살펴보세요.

for 반복문 사용하기

fun main(args: Array<String>) {
    for (arg in args) {
        print(arg)
    } 
}

혹은

for (i in args.indices) {
    print(args[i])
}

for loop를 살펴보세요.

while 반복문 사용하기

fun main(args: Array<String>) {
    var i = 0
    while (i < args.size) {
        print(args[i++])
    }  
}

while loop를 살펴보세요.

when 표현식 사용하기

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

when expression를 살펴보세요.

Ranges 사용하기

in 연산자를 사용하여 숫자가 범위 안에 있는지 확인:

if (x in 1..y-1) {
    print("OK")
}

숫자가 범위 밖에 있는지 확인:

if (x !in 0..array.lastIndex) {
    print("Out")
}

범위 반복 적용:

for (x in 1..5) {
    print(x)
}

Ranges를 살펴보세요.

Collections 사용하기

Collection 반복하기:

for (name in names) {
    println(name)
}

in 연산자를 사용하여 collection에 어떤 객체가 담겨 있는지 확인:

if (text in names) { // names.contains(text) is called
    print("Yes")
}

람다 표현식을 이용해서 collection을 필터링 및 매핑하기:

names
        .filter { it.startsWith("A") }
        .sortedBy { it }
        .map { it.toUpperCase() }
        .forEach { print(it) }

Higher-order functions and Lambdas를 살펴보세요.