본문 바로가기

Kotlin

[Kotlin] 기본 문법 (2)

* 기본 문법 - 예외

  • Kotlin의 모든 Exception Class는 최상위 Class인 Throwable을 상속한다.
  • Error: 시스템에 비정상적인 상황이 발생할 경우, 예측이 어렵고 기본적으로 복구가 불가능하다. (OutOfMemoryError...)
  • Checked Exception: 시스템에서 포착이 가능하여 try-catch로 복구가 가능, 예외 처리를 강제한다. (IOException, FileNotFoundException...)
  • Unchecked Exception: 런타임 시에 발생하는 예외로 예외 처리를 강제하지 않는다. (NullPointerException...)
  • Kotlin은 Java에 비해 Checked Exception 처리를 강제하지 않는다.
fun main() {
    Thread.sleep(1) // try-catch를 강제하지 않는다.
}
  • try-catch를 표현식 형태로 작성 가능하다.
val a = try {
    "1234".toInt()
} catch (e: Exception) {
    println("예외 발생")
}
println(a) // 1234
  • Nothing Type: Exception이 발생할 수 있으면 반환하는 타입
    • 해당 타입을 반환하면, 다음 코드는 실행될지 모호하다는 Unreachable Code 메시지를 보여준다.
    • 엘비스 연산자(?:) + Nothing Type을 사용하면, 값이 없을 경우 반드시 예외가 발생한다는 보장이 존재하기 때문에 안전 연산자 없이 null 접근이 가능하다.
val a: String? = null
val b = a ?: failException("a is null")
println(c.length)

fun failException(message: String): Nothing {
    throw IllegalArgumentException(message)
}

* 기본 문법 - Class/Property

  • class [ClassName](Class Constructor) { ... }
  • 생성자는 생략이 가능하다.
  • 기본적으로 NoArgumentConstructor, Getter, Setter를 생성한다.
  • Kotlin의 Class는 기본적으로 final class이다.
class Human(
    var name: String = "", // var 키워드 변수는 getter, setter 생성
    var age: Int = 0,
    var isMarried: Boolean = false,
) {
    val nickname: String // val 키워드 변수는 getter 만 생성
        get() = "empty" // custom getter

    var kids: Int = 0
        set(value) { // custom setter
            if (isMarried) {
                field = value // field 식별자가 아닌 kids 사용 시 kids가 또 다시 setter 호출 -> stack overflow
            }
        }
}

* 기본 문법 - 상속

  • Java의 경우 기본적으로 모든 Class가 상속이 가능하나, 부작용이 발생할 수 있기 때문에 Class 앞에 final 키워드를 붙인다.
  • Kotlin은 기본적으로 final class이기 때문에 open 키워드를 사용하여 상속할 수 있도록 한다.
open class Cat { // 상속이 가능한 class
    open var age: Int = 0

    open fun bark() {
        println("야옹")
    }
}
  • Kotlin의 최상위 Class는 Any Class이다.
  • override 키워드를 통해 필드 및 함수를 재정의 할 수 있고 overried 키워드를 사용하여 구현한 필드 및 함수는 자동으로 open이 된다.
open class Siamese(override var age: Int = 0): Cat() {
    override fun bark() {
        println("애옹..")
    }
}
  • 자동으로 open되는 것을 방지하기 위해서는 final 키워드를 붙여야 한다.
class SiameseChild: Bulldog() {
    override var age: Int = 0

    final override fun bark() {
        super.bark()
    }
}
  • Kotlin에서도 추상 클래스를 지원한다.
abstract class Human {
    abstract var age: Int
    abstract fun setMoney(money: Int)
}

class Parent(override var age: Int = 0): Human() {
    override fun setMoney(money: Int) {
        println("I have $money won")
    }
}

* 기본 문법 - 인터페이스

  • interface 키워드를 사용한다.
  • 상속 -> :ClassName(), 인터페이스 -> :ClassName
  • 인터페이스 내부에 property 사용이 가능하다
interface Wheel {
    fun roll()
}

interface Cart: Wheel {

    var coin: Int

    val weight: String
        get() = "20KG"

    fun add(product: Product)

    fun rent () {
        if (coin > 0) {
            println("카트 대여.")
        }
    }

    override fun roll() {
        println("카트 이동 중...")
    }

    fun printId() = println("1234")
}

interface Order {
    fun add(product: Product) {
        println("${product.name} 주문이 완료되었습니다.")
    }

    fun printId() = println("5678")
}
  • 다중 인터페이스 상속 시 동일 메서드 명을 가질 경우 super<interfaceName>으로 구분할 수 있다.
class MyCart(override var coin: Int = 0): Cart, Order {
    override fun add(product: Product) {
        if (coin <= 0) println("코인을 넣어주세요")
        else println("${product.name}이(가) 카트에 추가되었습니다.")

        super<Order>.add(product)
    }

    override fun printId() {
        super<Cart>.printId()
        super<Order>.printId()
    }
}

'Kotlin' 카테고리의 다른 글

[Kotlin] 범위 지정 함수  (0) 2023.03.23
[Kotlin] 기본 문법 (4)  (0) 2022.10.28
[Kotlin] 기본 문법 (3)  (0) 2022.10.27
[Kotlin] 기본 문법 (1)  (0) 2022.10.23
[Kotlin] Kotlin이란?  (0) 2022.10.21