* 기본 문법 - 예외
- 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 |