Kotlin/Reference

[Kotlin Reference] 기본 문법(Basic Syntax)

정코드 2019. 6. 16. 00:43


기본 문법(Basic Syntax)


패키지 정의하기(Defining packages)


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


1
2
3
4
5
package my.demo

import java.util.*

// ...
cs


디렉토리와 패키지를 일치시키지 않아도 됩니다.



함수 정의하기(Defining functions)


두 개의 Int 매개변수를 가지고 있고, Int를 반환하는 함수입니다.


1
2
3
4
5
6
7
8
fun sum(a: Int, b: Int): Int {
    return a + b
}

fun main() {
    print("sum of 3 and 5 is ")
    println(sum(35))
}
cs


본문이 식으로 되어있고, 유추된 타입을 반환하는 함수입니다.


1
2
3
4
5
fun sum(a: Int, b: Int= a + b

fun main() {
    println("sum of 19 and 23 is ${sum(19, 23)}")
}
cs


의미없는 값을 반환하는 함수입니다.


1
2
3
4
5
6
7
fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}

fun main() {
    printSum(-18)
}
cs


Unit 타입은 생략이 가능합니다.


1
2
3
4
5
6
7
fun printSum(a: Int, b: Int) {
    println("sum of $a and $b is ${a + b}")
}

fun main() {
    printSum(-18)
}
cs



변수 정의하기(Defining variables)


읽기 전용 지역 변수는 val 키워드를 사용합니다. 값은 한 번만 할당 가능합니다.


1
2
3
4
5
6
7
fun main() {
    val a: Int = 1  // 즉시 할당
    val b = 2   // Int 타입으로 유추
    val c: Int  // 초기화가 제공되지 않을 때 필요한 유형
    c = 3       // 지연 할당
    println("a = $a, b = $b, c = $c")
}
cs


재할당 가능한 변수는 var 키워드를 사용합니다.


1
2
3
4
5
fun main() {
    var x = 5 // Int 타입으로 유추
    x += 1
    println("x = $x")
}
cs


최상위 변수


1
2
3
4
5
6
7
8
9
10
11
12
13
val PI = 3.14
var x = 0

fun incrementX() { 
    x += 1 
}

fun main() {
    println("x = $x; PI = $PI")
    incrementX()
    println("incrementX()")
    println("x = $x; PI = $PI")
}
cs



주석(Comments)


단일 주석, 블록 주석, 문서 주석을 사용할 수 있습니다. 블록 주석은 중첩이 가능합니다.


1
2
3
4
// 단일 주석

/* 블록
   주석 */
cs



문자열 템플릿 사용하기(Using string templates)


1
2
3
4
5
6
7
8
9
10
fun main() {
    var a = 1
    // 단순명:
    val s1 = "a is $a" 

    a = 2
    // 임의의 식:
    val s2 = "${s1.replace("is", "was")}, but now is $a"
    println(s2)
}
cs



조건식 사용하기(Using conditional expressions)


1
2
3
4
5
6
7
8
9
10
11
fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

fun main() {
    println("max of 0 and 42 is ${maxOf(0, 42)}")
}
cs


식으로 사용하기


1
2
3
4
5
fun maxOf(a: Int, b: Int= if (a > b) a else b

fun main() {
    println("max of 0 and 42 is ${maxOf(0, 42)}")
}
cs



nullable 사용하기, null 체크하기(Using nullable values and checking for null)


값이 null일 수도 있으면, 참조를 nullable로 명시해야 합니다.


1
2
3
4
// str을 정수로 변환할 수 없으면 null 반환
fun parseInt(str: String): Int? {
    // ...
}
cs


nullable 값을 반환하는 함수 사용하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fun parseInt(str: String): Int? {
    return str.toIntOrNull()
}

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    // 'x * y'가 null일 수도 있기 때문에 에러 발생 가능
    if (x != null && y != null) {
        // null 체크 후에 x와 y는 자동으로 non-nullable로 변환
        println(x * y)
    }
    else {
        println("either '$arg1' or '$arg2' is not a number")
    }    
}

fun main() {
    printProduct("6""7")
    printProduct("a""7")
    printProduct("a""b")
}
cs


또는


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
fun parseInt(str: String): Int? {
    return str.toIntOrNull()
}

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    
    // ...
    if (x == null) {
        println("Wrong number format in arg1: '$arg1'")
        return
    }
    if (y == null) {
        println("Wrong number format in arg2: '$arg2'")
        return
    }
    // null 체크 후에 x와 y는 자동으로 non-nullable로 변환
    println(x * y)
}

fun main() {
    printProduct("6""7")
    printProduct("a""7")
    printProduct("99""b")
}
cs



타입 체크하기, 자동 형변환(Using type checks and automatic casts)


is로 주어진 타입의 인스턴스인지 확인합니다. 타입 체크 후에 자동 형변환됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        // 이 위치에서 'obj'는 'String'으로 자동 형변환
        return obj.length
    }
    // 외부에서 'obj'는 Any 타입
    return null
}
fun main() {
    fun printLength(obj: Any) {
        println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
    }
    printLength("Incomprehensibilities")
    printLength(1000)
    printLength(listOf(Any()))
}
cs


또는


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fun getStringLength(obj: Any): Int? {
    if (obj !is Stringreturn null

    // 이 위치에서 'obj'는 'String'으로 자동 형변환
    return obj.length
}

fun main() {
    fun printLength(obj: Any) {
        println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
    }
    printLength("Incomprehensibilities")
    printLength(1000)
    printLength(listOf(Any()))
}
cs


또는


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fun getStringLength(obj: Any): Int? {
    // 'obj'는 '&&' 오른쪽에서 'String'으로 자동 형변환
    if (obj is String && obj.length > 0) {
        return obj.length
    }
    return null
}

fun main() {
    fun printLength(obj: Any) {
        println("'$obj' string length is ${getStringLength(obj) ?: "... err, is empty or not a string at all"} ")
    }
    printLength("Incomprehensibilities")
    printLength("")
    printLength(1000)
}
cs



for 반복문 사용하기(Using a for loop)


1
2
3
4
5
6
fun main() {
    val items = listOf("apple""banana""kiwifruit")
    for (item in items) {
        println(item)
    }
}
cs


또는


1
2
3
4
5
6
fun main() {
    val items = listOf("apple""banana""kiwifruit")
    for (index in items.indices) {
        println("item at $index is ${items[index]}")
    }
}
cs



while 반복문 사용하기(Using a while loop)


1
2
3
4
5
6
7
8
fun main() {
    val items = listOf("apple""banana""kiwifruit")
    var index = 0
    while (index < items.size) {
        println("item at $index is ${items[index]}")
        index++
    }
}
cs



when 사용하기(Using when expression)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fun describe(obj: Any): String =
    when (obj) {
        1          -> "One"
        "Hello"    -> "Greeting"
        is Long    -> "Long"
        !is String -> "Not a string"
        else       -> "Unknown"
    }

fun main() {
    println(describe(1))
    println(describe("Hello"))
    println(describe(1000L))
    println(describe(2))
    println(describe("other"))
}
cs



range 사용하기(Using ranges)


in을 사용하여 숫자가 범위 내에 있는지 확인합니다.


1
2
3
4
5
6
7
fun main() {
    val x = 10
    val y = 9
    if (x in 1..y+1) {
        println("fits in range")
    }
}
cs


숫자가 범위를 벗어났는지 확인합니다.


1
2
3
4
5
6
7
8
9
10
fun main() {
    val list = listOf("a""b""c")

    if (-1 !in 0..list.lastIndex) {
        println("-1 is out of range")
    }
    if (list.size !in list.indices) {
        println("list size is out of valid list indices range, too")
    }
}
cs


범위 반복


1
2
3
4
5
fun main() {
    for (x in 1..5) {
        print(x)
    }
}
cs


progression


1
2
3
4
5
6
7
8
9
fun main() {
    for (x in 1..10 step 2) {
        print(x)
    }
    println()
    for (x in 9 downTo 0 step 3) {
        print(x)
    }
}
cs



컬렉션 사용하기(Using collections)


컬렉션 내에서 반복


1
2
3
4
5
6
fun main() {
    val items = listOf("apple""banana""kiwifruit")
    for (item in items) {
        println(item)
    }
}
cs


in을 사용하여 컬렉션에 객체가 포함되었는지 확인합니다.


1
2
3
4
5
6
7
fun main() {
    val items = setOf("apple""banana""kiwifruit")
    when {
        "orange" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }
}
cs


람다식을 사용하여 컬렉션 필터링, 매핑하기


1
2
3
4
5
6
7
8
fun main() {
  val fruits = listOf("banana""avocado""apple""kiwifruit")
  fruits
    .filter { it.startsWith("a") }
    .sortedBy { it }
    .map { it.toUpperCase() }
    .forEach { println(it) }
}
cs



기본 클래스와 인스턴스 생성(Creating basic classes and their instances)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
fun main() {
    val rectangle = Rectangle(5.02.0// 'new' 키워드 불필요
    val triangle = Triangle(3.04.05.0)
    println("Area of rectangle is ${rectangle.calculateArea()}, its perimeter is ${rectangle.perimeter}")
    println("Area of triangle is ${triangle.calculateArea()}, its perimeter is ${triangle.perimeter}")
}

abstract class Shape(val sides: List<Double>) {
    val perimeter: Double get() = sides.sum()
    abstract fun calculateArea(): Double
}

interface RectangleProperties {
    val isSquare: Boolean
}

class Rectangle(
    var height: Double,
    var length: Double
) : Shape(listOf(height, length, height, length)), RectangleProperties {
    override val isSquare: Boolean get() = length == height
    override fun calculateArea(): Double = height * length
}

class Triangle(
    var sideA: Double,
    var sideB: Double,
    var sideC: Double
) : Shape(listOf(sideA, sideB, sideC)) {
    override fun calculateArea(): Double {
        val s = perimeter / 2
        return Math.sqrt(s * (s - sideA) * (s - sideB) * (s - sideC))
    }
}
cs





출처


https://kotlinlang.org/docs/reference/basic-syntax.html