*참고 저서 <오준석의 안드로이드 생존코딩>
1. 인터페이스 (interface)
자바에서의 인터페이스와 같이 기능해, 다중 구현이 가능하다. 사용법 역시 거의 비슷하다.
interface Runnable{
fun run()
}
class Human : Runnable {
overrride fun run() {
println("달린다")
}
}
자바의 인터페이스와는 다르게, abstract 키워드를 생략할 수 있다.
2. null 가능성
코딩을 하다 보면 nullExceptionError를 빈번히 마주하게 된다. 객체에 null이 할당되어 있을 때, 생기는 에러이다.
코틀린의 경우 null safety에 상당히 엄격하다. null을 기본적으로 불허하며, 별도의 연산자를 이용해 null을 허용해야 한다. 이 경우 변수를 호출할 때도 별도의 안전한 방법을 사용해 호출해야만 한다. 이를 지키지 않을 시 문법적으로 오류를 먼저 발생시켜버린다.
따라서 모든 객체는 기본적으로 선언과 동시에 초기화를 해야만 하며, 그렇지 않을 시 자료형 옆에 ? 연산자를 붙여 null을 허용하는 객체임을 명시해야한다.
val a : String?
1) 늦은 초기화 (lateinit, lazy)
하지만 개발 시 null을 불허하는 객체임에도 초기화를 선언 이후에 해야만 하는 객체가 있다.
lateinit var a: String
a = "apple"
var의 경우lateinit 키워드를 사용하여 늦은 초기화를 할 수 있다. 다만 이를 사용 시 추후에 무조건 초기화를 해주어야만 하며, 그 이전까지는 변수를 사용할 수 없다. Int, Long, Double, Float 에서도 사용할 수 없는 키워드이다.
val str: String by lazy {
println("initialize")
"hello"
}
println(str)
val의 경우 lazy라는 키워드를 사용한다. lateinit과는 방식이 조금 다른데, by lazy 이후의 블럭에 코드를 작성하고
마지막줄에 초기화시킬 값을 적어준다. 이는 선언시에는 실행되지 않다가, 변수를 처음으로 호출할 때 실행되며 변수를 초기화시킨다.
2) 다른 null 관련 연산자 (!!, ?. , ?:)
변수 뒤에 !!를 붙여주면 null이 아님을 보증해준다. null을 허용하지 않는 변수에 null을 허용하는 변수를 할당할 때 에러가 일어나기 때문에 null을 허용하는 변수 뒤에 !!를 붙여줘야만 에러가 나지 않는다.
val name: String? = "john"
val name2 : String = name!! // !!가 없으면 에러
메서드 호출 시 사용하는 . 연산자 대신 ?.를 사용하면 객체가 null이 아닐때만 호출할 수 있다.
upper = str?.toUpperCase
객체가 null일 때는 null을 반환하는데, 다른 반환값을 설정할 때 ?:를 사용한다.
upper = str?.toUpperCase ?: "not initialized"
'대딩 기록(~22.01) > 안드로이드 공부노트' 카테고리의 다른 글
안드로이드앱 배포 파일 APK vs AAB(Andriod app bundle) (0) | 2022.01.23 |
---|---|
안드로이드 액티비티 생명주기 (0) | 2021.08.20 |
코틀린 기본 구문 (컬렉션, 람다) (0) | 2021.08.18 |
코틀린 기본 구문 (제어문, 클래스) (0) | 2021.08.16 |
코틀린 기본 구문 (변수/상수 , 함수, 자료형) (0) | 2021.08.15 |