개발일지
2. 심화 본문
- NULL처리방법
- 기본적으로 null 허용x
- null 을 명시적으로 나타내기 위해서 ?을 추가해야 한다.
- java 디컴파일시 exception 이 발생하도록 내부 처리를 하고 있다.
- IDE 에서 null 을 사용할 수 없음을 즉시 알려준다.
2. safe calls
var temp: String? = null
val size = temp?.length
<장점>
ex) return aaa?.bbb?.ccc?.name
========Null 예외처리 ===========
- Elvis Operator을 사용해 null 인 경우 값을 지정
- Elvis Operator → ?:
ex) textview.text = temp ?: " "
2. NPE(Null Point Exception)
- !! : null 인 경우 자동으로 NPE 발생시킴
ex) val temp: String?= null
val size = temp!!.length
==========기타 Null 처리 ==============
- 코틀린 안전한 형변환 시도하기
val a: Any? = "ABC"
val b: Int? = a as Int // a 를 Int 로 형변환해라
→ ClassCastException 발생 // a 는 Sring b 는 Int 이기 때문
val a: Any? = "ABC"
val b: Int? = a as? Int
2. List 에서 null 아이템 제외하기 - filterNotNull 사용하기
3. Block 을 이용한 null 예외처리
- Kotlin library
코틀린에는 유용한 standard (run, let, apply...) 을 제공
한번에 많은 처리 할 수 있음
4. 1개 이상의 null체크
============= 클래스 상속 ================
- open class (open 을 붙이지 않으면 자동으로 final로 되어있어 상속하지 못함)
- abstract - open 있어야 확장가능
- interface - open없어도 확장 가능
<java8>
final 변수 선언 가능(상속시 값을 변경할 수 없음)
default : 기본함수를 구현할 수 있다
static : 기본함수를 구현하고 static으로 접근할 수 있다. - Base.isTypeZero // 재정의 불가능
항상 상속받을 수 있는 상태
<kotlin>
final정의를 하지 못하고 반드시 상속에서 구현해야 함
별도의 키워드 없이 default 메서드와 정의 가능
- open 정의 없이 모두 확장 가능 (인터페이스이기 때문)
===================
<abstract>
abstract class Base(val a : Int )
class Sample(a: Int ) : Base(a)
<interface>
interface Base {
fun printValue(a: Int)
}
class Sample : Base {
override fun printValue(a:Int){
println("value a : $a") } }
=====================Companion object(자바의 static 같이)=============
- class 내에 정의할 수 있음
- Java 에서처럼 Class.TYPE 형태로 직접 접근 가능
- static 은 아님
Companion object 을 통해서 헤딩 객체 사용 가능
=========================sealed classes ==============
다형성이란?
부모클래스를 상속받은 자식클래스
자식클래스는 부모클래스로부터 접근할 수 있다
이때 자식클래스는 모두 다른 행동을 할 수 있다.
- 생성자는 private
- sealed class 와 sealed class 를 상속받는 클래스는 하나으 파일 안에 정의되어야 한다.
- sealed class {} 안에 class 을 정의할 수 있음
- abstract 메소드를 생성할 수 있음
===========class===============
#싱글톤 구현하기 – kotlin object
object 클래스이름
- 생성자를 가질 수 없다
#class 안에 class 정의하기 → Nested class
#Anonymous ineer class
==========Higher - Order functions =============
- 함수를 파라미터로 전달하거나 함수를 리턴가능
- lambda 를 통해 축약 형태로 제공
- 변수로 함수를 가질 수 있다.
마지막 Higher - Order functions 에서는 () 제거 가능
======================kotlin standard library ==========
- let : data의 null 체크를 할 때 주로 사용
ex) val name: String? = ""
name?.let{ // null 이 아닌 경우에 프린트해라
println("name $it length ${it.length}") }
- apply : 생성과 동시에 값을 초기화할 때 유용
ex) val textview = TextView(this).apply {
text = "button"
setTextColor(getColor(R.color.lll))
setOnClickListener{}
} - run : 이미 생성한 객체에 대하여 재 접근 시 주로 사용 // 연속적인 접근을 줄여준다
ex) textView.run {
text = "click button"
setOnClickListener{}
} - with() : view 에 접근할 때 주로 사용
- also() : 첫번째블록과 두번째 블록을 분리시켜주는 것
- takeif : 받아온 값을 체크하는데 리턴을 boolean / 조건함수가 true 일때 자기 자신 (this) 을 반환, false 일때 null 을 반환하고 합니다.
- takeUnless : 조건함수가 true 일때 null 을 반환하고, false 일때 자기 자신 (this) 을 반환합니다.
==============Generics ================
##generic 함수 정의
클래스나 함수를 정의할 때 확실히정해지지 않는 것을 말함. → 다양한 타입으로 클래스를 여러 개 정의하지 않아도 됨
타입이 정해지지 않은 변수는 함수 앞에 <T> 처럼 정의되어야 함
##generic 클래스 정의 // 이름 다음에 <T> 가 옴
- 가장흔하게 볼 수 있는 Generics 정의는 List다. : List<T>
- Generics은 <>안에 타입 파라메터 정의
ex) interface Generic<in T> {
fun setItem(item: T)
}
class Sample : Generic<String>{
override fun setItem(item: String) // 구현
}
- wildcard type arguments
- ? extends T : read만 가능한 서브타입 와일드카드
- ? super T : wirte 만 가능한 슈퍼타입 와일드카드
2. Kotlin 의 in/out
- T : 별도의 wildcard 정의가 없이 read/write 모두 가능
- in T : Java의 ? super T 와 같고, input 의 약자이며 write only
- out T : Java의 ? extends T 와 같고 output의 약자이며 read only
======================SAM Class ===================
- Single Abstract Methods ; SAM
- lambdas 식을 제공
- Java 에서 정의해야 함
-interface/ abstract - Single Abstract Methods
-setter 정의
- SAM은 언제 동작?
- setter 와 추상클래스 모두가 java 파일로 정의되어야 함
- 둘 중 하나라도 kotlin 파일로 정의하면 SAM 은 동작하지 않는다
========lateinit / lazy 로 초기화를 지연하는 방법 ===============
- 사용할지 모르는 데이털틑 미리 초기화 할 필요 없어 성능 향상에 도룸
- 앱을 실행했을 때 미리 가져오는 것보다 데이터를 화면에 보여줄 때 가져오는 것이 CPU , 네트워크 자원을 아낄 수 있음
- Late initialization : 필요할 때 초기화하고 사용할 수 있음
-var에서만 사용 가능(primitive type 에 적용할 수 없음 )
-custom getter / setter 를 만들 수 없음
-Nonnull 프로퍼티만 가능 - ]
- Lazy initialization: 변수를 선언할 때 초기화 코드도 함께 정의 ./ 변수가 사용될 때 초기화 코드 동작하여 변수가 초기화 됨
'Kotlin' 카테고리의 다른 글
Kotlin 코틀린 써야하는 이유!! (0) | 2022.11.05 |
---|---|
4. 화면구성하기 (0) | 2021.07.06 |
3. Architecture (0) | 2021.07.06 |
1. Basic Syntax (0) | 2021.07.06 |