ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] Basic syntax 기초 구문
    language/Kotlin 2021. 7. 11. 23:45
    반응형

    package 정의와 imports

    package 사양은 소스파일의 최상단에 위치합니다.

    이 때, 디렉토리와 패키지가 매치될 필요는 없습니다. 소스파일은 디렉토리와 상관없이 파일 시스템 어디든 위치할 수 있습니다.

    package com.tistory.webfirewood.kotlin
    
    import kotlin.text.*
    
    // ...

    program entry point

    코틀린의 시작점(entry point)은 main 함수 입니다. 

    fun main() {
        println("Hello world!")
    }

    또다른 형태의 main 함수는 복수의 String arguments를 받을 수 있습니다.

    fun main(args: Array<String>) {
        println(args.contentToString())
    }

    standard output

    print 함수는 argument 를 standard output 으로 출력합니다.

    fun main() {
        print("Hello ")
        print("world!")
    }

    println 함수는 argument를 출력하고 뒤에 line break를 추가합니다. 그래서 다음 출력은 다음 라인에 나타나게 됩니다.

    fun main() {
        println("Hello world!")
        println(32)
    }

    함수

    두 Int 파라미터를 받아서 Int 값을 리턴하는 함수

    fun sum(a: Int, b: Int): Int {
        return a + b
    }
    
    fun main() {
        println("sum of 3 and 5 is ")
        println(sum(3, 5))
    }

    이때, 리턴타입이 추론된다면 생략할 수 있습니다.

    fun sum(a: Int, b: Int) = a + b
    
    fun main() {
        println("sum of 11 and 21 is ${sum(11, 21)}")
    }

    리턴타입이 의미없는 값인 경우

    fun printSum(a: Int, b: Int): Unit {
        println("sum of $a and $b is ${a + b}")
    }
    
    fun main() {
        printSum(3, 4)
    }

    이 때, Unit 역시 생략 가능합니다.

    변수

    읽기 전용 지역 변수는 val 키워드로 정의한다. 이것들은 딱 한번만 값이 할당됩니다.

    fun main() {
        val a: Int = 1 // 즉시 할당
        val b = 2 // Int 타입이 추론 된다
        val c: Int // 값이 초기화 되지 않으면 타입이 필요
        c = 3
        println("a = $a, b = $b, c = $c")
    }

    재할당 가능한 변수는 var 키워드로 선언합니다.

    fun main() {
        var x = 5;
        x += 1;
        println("x = $x")
    }

    클래스와 인스턴스

    클래스를 선언하기 위해서 class 키워드를 사용합니다. 클래스의 속성은 선언문이나 바디에 선언할 수 있습니다.

    class Rectangle(var height: Double, var length: Double) {
        var perimeter = (height + length) * 2
    }
    
    fun main() {
        val rectangle = Rectangle(5.0, 2.0)
        println("The perimeter is ${rectangle.perimeter}")
    }

    클래스 사이의 상속은 콜론 ':' 으로 정의합니다. 상속할 수 있는 클래스를 만들기 위해서 open 을 표시합니다.

    open class Shape
    
    class Rectangle(var height: Double, var length: Double): Shape() {
        var perimeter = (height + length) * 2
    }

    조건문

    조건문은 다른 언어와 유사하지만 코틀린에서는 if 를 표현식으로 쓸 수 있습니다.

    fun maxOf(a: Int, b: Int) = if (a > b) a else b
    
    fun main() {
        println("max of 0 and 42 is ${maxOf(0, 42)}")
    }

    for loop

    fun main() {
        val items = listOf("apple", "banana", "kiwifruit")
        for (item in items) {
            println(item)
        }
    }

    또는

    fun main() {
        val items = listOf("apple", "banana", "kiwifruit")
        for (index in items.indices) {
            println(items[index])
        }
    }

    when 표현식

    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"))
    }

    ranges

    만약 숫자가 어떤 범위 안에 있는지 확인하고 싶을때 in 연산자를 씁니다. (Collections 에서도 사용법이 같습니다.)

    fun main() {
        val x = 10
        val y = 9
        if (x in 1..y+1) {
            println("fits in range")
        }
    }
    fun main() {
        val list = listOf("a", "b", "c")
        if ("a" in list) {
            println("a is in list.")
        }
    }

    for 문에서도 in 연산자를 사용합니다.

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

    Nullable

    null 값이 들어올 수 있는 변수는 타입 끝에 '?' 를 붙여서 표시합니다.

    반환값이 null 또는 Int 일 수 있는 함수의 경우 다음과 같습니다.

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

    타입체크와 자동 캐스트

    is 연산자는 ㅍ현식이 어떤 인스턴스 타입인지 체크합니다. 

    fun getStringLength(obj: Any): Int? {
        if (obj is String) {
            // 이 분기에서 obj 는 자동으로 String 으로 캐스트 됩니다.
            return obj.length;
        }
        // 분기 밖에서 obj는 여전히 Any 타입입니다.
        return null;
    }
    반응형
Designed by Tistory.